实现WCF同步和异步

时间:2014-01-15 15:57:07

标签: c# wcf asynchronous blocking

我在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;

2 个答案:

答案 0 :(得分:2)

不,它表现不佳。您的客户端代码不需要知道服务器端是同步还是异步。

相反,只需将代码保留为Method1,并在客户端代码上只让客户端代码生成同步和异步函数。

通过SvcUtil.exe

svcutil.exe /async /lang:csharp http://YourWcfUrlHere.com

通过GUI: enter image description here

即使服务器端只存在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一词。