C# 实现WCF同步和自动同步

C# 实现WCF同步和自动同步,c#,wcf,asynchronous,blocking,C#,Wcf,Asynchronous,Blocking,我在WCF工作。 它应该具有同步和异步实现。主要约束是非阻塞异步版本 我已经实现了接口的这一部分: [OperationContract] [FaultContract(typeof(FaultException))] int Method1(string userName, string companyName); 现在我应该实现接口的异步部分: [OperationContract] [FaultContract(typeof(FaultException))] int Method1(s

我在WCF工作。 它应该具有同步和异步实现。主要约束是非阻塞异步版本 我已经实现了接口的这一部分:

[OperationContract]
[FaultContract(typeof(FaultException))]
int Method1(string userName, string companyName);
现在我应该实现接口的异步部分:

[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);
[运营合同]
[FaultContract(类型(FaultException))]
任务方法1同步(字符串用户名、字符串公司名称);
//int Method1Async(字符串用户名、字符串公司名称);
执行以下操作是否正确且有利于性能:

Task<int> myTask = new Task<string>(() => Method1(userName,companyName));
myTask.Start();
int res = await myTask;
return myTask;//return res;
Task myTask=新任务(()=>Method1(用户名,公司名称));
myTask.Start();
int res=等待我的任务;
返回我的任务//返回res;

不,它的性能一点也不好。客户端代码不需要知道服务器端是同步的还是异步的

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

通过
SvcUtil.exe

svcutil.exe /async /lang:csharp http://YourWcfUrlHere.com
通过GUI:


这将创建
intmethod1(字符串用户名,字符串公司名称)
任务方法1同步(字符串用户名、字符串公司名称)客户端,即使只有
intmethod1(字符串用户名,字符串companyName)存在于服务器端。

实现基于
的返回任务有两种方法

//Not as good, uses more marshaling than really needed.
Task<int> Method1Async(string userName, string companyName)
{
    return Task.Run(() => Method1(username, companyName));
}
//不太好,使用了比实际需要更多的封送处理。
任务方法1同步(字符串用户名、字符串公司名称)
{
返回Task.Run(()=>Method1(用户名,公司名称));
}

Task Method1Async(字符串用户名、字符串公司名称)
{
返回Task.Result(Method1(用户名,公司名称));
}

请注意,我一次都没有使用async这个词。

-1如果你能控制方程的两面,你应该为你的接口创建一个具体的dll。在这种情况下,您希望包含基于任务的方法。对于创建具体的dll,您可能有不同的意见,但这是否证明我的答案被视为“无用”?@Aron我编辑了这个问题,您应该能够更改您的votesIt不编译错误1,因为这是一个异步方法,返回表达式的类型必须是“int”而不是“Task”。请注意,方法sig中缺少async关键字!