任务完成后处理代码

时间:2014-02-26 12:02:07

标签: c# winforms vsto async-await

我正在尝试在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;
        }
    }

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

C#中,方法名称始终为CamelCase,异步方法始终以异步为后缀。只是惯例。

您可能希望将非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;
    }
}

注意:不要忘记正确的异常处理!!!