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)
添加服务引用时,可以选择生成操作的异步版本.
这是(较旧的)APM模式(IAsyncResult,BeginMethod,EndMethod).您可以使用FromAsync将其挂钩到异步/等待:
var task = Task.Factory.FromAsync(BeginGetResultCount, EndGetResultCount, myParams);
Run Code Online (Sandbox Code Playgroud)
当你有很多调用时,这是更好的,它不会浪费这么多线程来等待I/O.
归档时间: |
|
查看次数: |
5882 次 |
最近记录: |