我在WCF工作。 它应该具有同步和异步实现主要约束是非阻塞异步版本 我已经实现了这部分界面:
[OperationContract]
[FaultContract(typeof(FaultException))]
int Method1(string userName, string companyName);
现在我应该实现接口的异步部分:
//接口是否正确
[OperationContract]
[FaultContract(typeof(FaultException))]
Task<int> Method1Async(string userName, string companyName);
//int Method1Async(string userName, string companyName);
执行以下操作是否正确且性能良好:
Task<int> myTask = new Task<string>(() => Method1(userName,companyName));
myTask.Start();
int res = await myTask;
return myTask;//return res;
答案 0 :(得分:2)
不,它表现不佳。您的客户端代码不需要知道服务器端是同步还是异步。
相反,只需将代码保留为Method1
,并在客户端代码上只让客户端代码生成同步和异步函数。
通过SvcUtil.exe
svcutil.exe /async /lang:csharp http://YourWcfUrlHere.com
通过GUI:
即使服务器端只存在int Method1(string userName, string companyName);
,也会创建Task<int> Method1Async(string userName, string companyName);
和int Method1(string userName, string companyName);
客户端。
答案 1 :(得分:1)
您有两种方法可以实现基于Task
的退货。
//Not as good, uses more marshaling than really needed.
Task<int> Method1Async(string userName, string companyName)
{
return Task.Run(() => Method1(username, companyName));
}
OR
Task<int> Method1Async(string userName, string companyName)
{
return Task.Result(Method1(username, companyName));
}
注意我没有使用过async
一词。