C# 实现WCF同步和自动同步
我在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
[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关键字!