2014-02-26 77 views
0

我試圖在ASYNC任務正在執行時顯示等待符號。任務完成後處理代碼

我真的很新的這一點,所以如果有實現這個代碼更好的方法,請賜教:)

但是,一切正常,除了pictureBox1的隱藏代碼完成後有現在找到結果。換句話說,當有一個結果,pictureBox1隱藏

下面是運行每一個Outlook項目打開

private void FormRegion1_FormRegionShowing(object sender, System.EventArgs e) 
    { 
      if (this.OutlookItem is Microsoft.Office.Interop.Outlook.MailItem) 
      { 
       Microsoft.Office.Interop.Outlook.MailItem item = (Microsoft.Office.Interop.Outlook.MailItem)this.OutlookItem; 
       getContactByEmail(item);      
      } 
    } 

這一次的方法是,我實現了等待的東西的方法

public async Task getContactByEmail(Microsoft.Office.Interop.Outlook.MailItem item) 
    { 
     pictureBox1.Visible = true; 
     using (var client = new System.Net.Http.HttpClient()) 
     { 
      client.BaseAddress = new Uri("http://api....."); 
      client.DefaultRequestHeaders.Accept.Clear(); 

      HttpResponseMessage response = await client.GetAsync("tools/getContactByEmail?email=" + item.SenderEmailAddress + "&key=1232"); 

      if (response.IsSuccessStatusCode) 
      { 
       SimpleContact contact = await response.Content.ReadAsAsync<SimpleContact>(); 

       lblName.Text = contact.Name; 
       lblMobile.Text = contact.Phone; 
      } 

      pictureBox1.Visible = false; 
     } 
    } 
+1

有什麼異常?因爲如果拋出異常'pictureBox1.Visible = false;'不會執行 –

+0

好..問題是,即使沒有結果,response.IsSuccessCode也是如此。那麼lbl.text = contact.Name會嘗試設置一個空值。這是一個例外。非常感謝您 – espenk

+0

歡迎,您可以刪除問題或自己發佈答案,您可以接受它一天或2日後:) –

回答

0

發佈修復此如此異常的代碼都沒有提出

if (response.IsSuccessStatusCode) 
{ 
    SimpleContact contact = await response.Content.ReadAsAsync<SimpleContact>(); 

    if (contact != null) 
    { 
     lblName.Text = contact.Name; 
     lblMobile.Text = contact.Phone; 
    } 

    pictureBox1.Visible = false; 
} 
0

C#方法名稱始終爲CamelCase,異步方法總是後綴Async。只是約定。

您可能希望將非UI代碼提取到另一個異步方法,以避免來回到UI線程:

private async void FormRegion1_FormRegionShowing(object sender, System.EventArgs e) 
{ 
     if (this.OutlookItem is Microsoft.Office.Interop.Outlook.MailItem) 
     { 
      Microsoft.Office.Interop.Outlook.MailItem item = (Microsoft.Office.Interop.Outlook.MailItem)this.OutlookItem; 

      pictureBox1.Visible = true; 

      var contact = GetContactByEmailAsync(item); 

      if (contact != null) 
      { 
       lblName.Text = contact.Name; 
       lblMobile.Text = contact.Phone; 
      } 

      pictureBox1.Visible = false; 
     } 
} 

public async Task<SimpleContact> GetContactByEmailAsync(Microsoft.Office.Interop.Outlook.MailItem item) 
{ 
    using (var client = new System.Net.Http.HttpClient()) 
    { 
     client.BaseAddress = new Uri("http://api....."); 
     client.DefaultRequestHeaders.Accept.Clear(); 

     HttpResponseMessage response = await client.GetAsync(
      "tools/getContactByEmail?email=" + item.SenderEmailAddress + "&key=1232") 
      .ConfigureAwait(false); 

     return (response.IsSuccessStatusCode) 
      ? await response.Content.ReadAsAsync<SimpleContact>(); 
      : null; 
    } 
} 

注意:不要忘了適當的異常處理!