我目前在工作中被限制在3.5版本中,但我们正在使用AsyncBridge进行异步等待。我们使用了很多旧的WCF异步调用,我希望将其包装到新的异步等待模式中。
我进行的包装如下:
// async is wrong
public /*async*/ Task<ScannedDocumentResult> GetScannedDocumentsTask(String assignmentId)
{
TaskCompletionSource<ScannedDocumentResult> tcs = new TaskCompletionSource<ScannedDocumentResult>();
EventHandler<GetScannedDocumentsCompletedEventArgs> handler = null;
handler = (o, e) =>
{
if (e.UserState != tcs)
return;
if (e.Error != null)
tcs.SetException(e.Error);
else if (e.Cancelled)
tcs.SetCanceled();
else
tcs.SetResult(e.Result);
GetScannedDocumentsCompleted -= handler;
};
GetScannedDocumentsCompleted += handler;
GetScannedDocumentsAsync(assignmentId, tcs);
return tcs.Task;
}
以下是在3.5 WCF代理中生成的内容:
GetScannedDocumentsAsync GetScannedDocumentsCompleted GetScannedDocumentsEventArgs
我觉得这个可以更加简洁,有没有什么关键的地方我漏掉了?另外,这个方法会异步执行吗?使用异步运算符进行编译只会生成错误。
GetScannedDocumentsAsync
方法是否返回IAsyncResult
?如果是的话,这篇优秀的博客文章描述了如何正确地实现它。 - noseratio - open to workasync
才能实际异步执行,那么你其实并不理解async
的含义。你可能需要更多地了解它。 - svick