2014-02-26 48 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; 
    } 
} 

注意:不要忘了适当的异常处理!