【问题标题】:Implement WCF sync and asyn实现 WCF 同步和异步
【发布时间】:2014-01-15 15:57:07
【问题描述】:

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

【问题讨论】:

    标签: c# wcf asynchronous blocking


    【解决方案1】:

    不,这根本不是很好的表现。您的客户端代码不需要知道服务器端是同步还是异步。

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

    通过SvcUtil.exe

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

    通过图形用户界面:

    这将创建int Method1(string userName, string companyName);Task&lt;int&gt; Method1Async(string userName, string companyName); 客户端,即使只有int Method1(string userName, string companyName); 存在服务器端。

    【讨论】:

    • -1 如果你可以控制等式的两边,你应该为你的接口创建一个具体的 dll。在这种情况下,您希望包含基于任务的方法。
    • 您可能对创建具体的 dll 有不同的看法,但这是否保证我的回答被认为“没用”?
    • @Aron 我编辑了这个问题,你应该可以改变你的投票
    【解决方案2】:

    您有两种方法可以实现基于 Task 的回报。

    //Not as good, uses more marshaling than really needed.
    Task<int> Method1Async(string userName, string companyName)
    {
        return Task.Run(() => Method1(username, companyName));
    }
    

    Task<int> Method1Async(string userName, string companyName)
    {
        return Task.Result(Method1(username, companyName));
    }
    

    请注意,我从未使用过 async 这个词。

    【讨论】:

    • 无法编译 错误1 由于这是一个异步方法,返回表达式必须是'int'类型而不是'Task'
    • 注意sig方法中async关键字的缺失!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多