WCF 3.5、AsyncBridge。使用async-await进行封装。

5

我目前在工作中被限制在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

我觉得这个可以更加简洁,有没有什么关键的地方我漏掉了?
另外,这个方法会异步执行吗?使用异步运算符进行编译只会生成错误。

1
GetScannedDocumentsAsync 方法是否返回 IAsyncResult?如果是的话,这篇优秀的博客文章描述了如何正确地实现它。 - noseratio - open to work
“async” 只允许在内部含有 “await” 的方法中使用。那么,“GetScannedDocumentsAsync”的定义是什么? - Toni Petrina
如果你认为一个方法需要使用 async 才能实际异步执行,那么你其实并不理解 async 的含义。你可能需要更多地了解它。 - svick
1个回答

6

你还应该获得 BeginGetScannedDocumentsEndGetScannedDocuments,并使用 TaskFactory.FromAsync 进行封装。我有一篇博客文章展示了如何在旧版(4.5之前)的WCF中使用任务封装程序(在服务器和客户端上均可),链接在此:如何与旧版WCF配合使用任务封装程序


在 Skeet 的帮助下,我在另一个线程中解决了这个问题,这简化了很多事情,也允许我使用尽可能多的参数。虽然如此,我还是将您标记为答案 :) - Stígandr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接