AsyncCompletedEventArgs

AsyncCompletedEventArgs

我写了两个看起来相似的函数,如何优化它们?

注意:

1. AsyncCompletedEventArgsDownloadStringCompletedEventArgUploadStringCompletedEventArgs的基类。

2. Result属性不在AsyncCompletedEventArgs中。

3. DownloadStringCompletedEventArgs具有Error属性,如果Errornull,则尝试访问Result属性,则会发生异常。

void fun1(DownloadStringCompletedEventArgs e)
{
    try
    {
        string s = e.Result;
    }
    catch (WebException eX)
    {
        HandleWebException();
    }
}

void fun2(UploadStringCompletedEventArgs e)
{
   try
   {
       string s = e.Result;
   }
   catch (WebException eX)
   {
       HandleWebException();
   }
}

最佳答案

UploadStringCompletedEventArgsDownloadCompletedEventArgs都扩展了AsyncCompletedEventArgs,但是不幸的是基类没有定义Result属性。

具有结果访问器委托的TryX模式在这里可能是合适的:

public bool TryGetResult(Func<string> resultAccessor, out string result)
{
    try
    {
        result = resultAccessor();
        return true;
    }
    catch(WebException)
    {
        HandleWebException();

        result = null;
        return false;
    }
}

void fun1(DownloadStringCompletedEventArgs e)
{
    string result;
    if (TryGetResult(() => e.Result, out result))
    {
        // Success
    }
}

void fun2(UploadStringCompletedEventArgs e)
{
    string result;
    if (TryGetResult(() => e.Result, out result))
    {
        // Success
    }
}


但是,我建议尝试检查AsyncCompletedEventArgs.Error,因为异常的代价非常高。

07-24 21:11