我写了两个看起来相似的函数,如何优化它们?
注意:
1. AsyncCompletedEventArgs
是DownloadStringCompletedEventArg
和UploadStringCompletedEventArgs
的基类。
2. Result
属性不在AsyncCompletedEventArgs
中。
3. DownloadStringCompletedEventArgs
具有Error
属性,如果Error
是null
,则尝试访问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();
}
}
最佳答案
UploadStringCompletedEventArgs
和DownloadCompletedEventArgs
都扩展了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,因为异常的代价非常高。