使用异步任务调用同步WCF服务

Pau*_*els 0 c# wcf asynchronous async-await .net-4.5

我有一个由服务客户端调用的WCF服务.我想使用async/await构造来包装对此的调用; 但是,服务和服务客户​​端是.NET3.5.我对此的解决方案如下:

private async Task<ObservableCollection<MyEntity>> LoadData(ParamData param)
{
        ServiceClient svc = new ServiceClient();
        int results = 0;

        // Set-up parameters
        myParams = BuildParams(param);

        // Call a count function to see how much data we're talking about
        // This call should be relatively quick
        var counter = Task.Factory.StartNew(() =>
        {
            results = svc.GetResultCount(myParams);
        }).ContinueWith((task) =>
        {
            if (results <= 10000 ||
                (MessageBox.Show("More than 10000 results, still retrieve data?"), MessageBoxButton.YesNo) == MessageBoxResult .Yes))
            {
                return svc.Search(myParams);
            }
        });
}
Run Code Online (Sandbox Code Playgroud)

我收到编译错误:

Since 'System.Action<System.Threading.Tasks.Task>' returns void, a return keyword must not be followed by an object expression
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是,是否有可能以这种方式运行同步方法,如果是这样,我做错了什么?我的目标是可以这样调用该方法:

var data = await LoadData(params);
Run Code Online (Sandbox Code Playgroud)

Hen*_*man 6

添加服务引用时,可以选择生成操作的异步版本.

这是(较旧的)APM模式(IAsyncResult,BeginMethod,EndMethod).您可以使用FromAsync将其挂钩到异步/等待:

 var task = Task.Factory.FromAsync(BeginGetResultCount, EndGetResultCount, myParams);
Run Code Online (Sandbox Code Playgroud)

当你有很多调用时,这是更好的,它不会浪费这么多线程来等待I/O.