相关疑难解决方法(0)

我如何防止CPU的“最大化”:异步调用多个工作进程并使用SemaphoreSlim进行限制的同步方法?

我目前正在优化现有的,非常慢的和超时的生产应用程序。没有选择来重写它

简而言之,这是一个WCF服务,当前依次调用其他四个“工作者” WCF服务。任何一个工人服务都不依赖于另一个的结果。因此,我们希望一次全部调用它们(而不是顺序调用)。我要重申的是,我们没有重写的奢望。

在此处输入图片说明

优化涉及使其立即调用所有工作者服务。这是想到异步的地方。

我在异步编程方面的经验有限,但是对于我的解决方案,我已经就该主题进行了尽可能多的阅读。

问题是,在测试中,它可以工作,但使我的CPU耗尽。谢谢您的帮助

以下是主要WCF服务中基本代码的简化版本

// The service operation belonging to main WCF Service
public void ProcessAllPendingWork()
{
    var workerTasks = new List<Task<bool>>();
    foreach(var workerService in _workerServices)
    {
        //DoWorkAsync is the worker method with the following signature:
        // Task<bool> DoWorkAsync()

        var workerTask = workerService.DoWorkAsync()
        workerTasks.Add(workerTask);
    }

    var task = Task.Run(async ()=>
    {
        await RunWorkerTasks(workerTasks);
    });
    task.Wait();


}

private async RunWorkerTasks(IEnumerable<Tast<bool>> workerTasks)
{
    using(var semaphore = new SemaphoreSlim(initialCount:3))
    {

        foreach (var workerTask in workerTasks)
        { …
Run Code Online (Sandbox Code Playgroud)

c# wcf asynchronous semaphore async-await

9
推荐指数
2
解决办法
427
查看次数

WCF ChannelFactory异步调用

我正在使用WCF和TPL异步库,我需要的是能够请求多个WCF方法并等待所有步骤都完成,到目前为止,我发现.NET 4.5中有非常方便的方法Task.Factory.ContinueWhenAll可以用于等待所有通话结束

我发现了以下几种以异步方式请求WCF调用的方法
。通过使用由“添加引用”对话框生成的代理以及选项“生成基于任务的操作”-> [例如,此处] [1]-在我的情况下不是一个选项就像我们使用Raw ChannelFactory
Option 2一样。通过将同步调用包装在任务中,例如

    ChannelFactory<IService1> factory = new ChannelFactory<IService1>("BasicHttpBinding_IService1");  

        Task<string> t1 = Task<string>.Factory.StartNew(() => { return factory.CreateChannel().GetData(2); });
        Task<string> t2 = Task<string>.Factory.StartNew(() => { return factory.CreateChannel().GetData(5); });

        Task.Factory.ContinueWhenAll(new[] { t1, t2 }, t =>
        {
            foreach (var task in t)
            {
                //get result here
            }
        });
Run Code Online (Sandbox Code Playgroud)

选项3.通过创建客户端异步版本的契约接口,例如

[ServiceContract(Namespace = "X", Name = "TheContract")]//Server side contract
public interface IService1
{
    [OperationContract]
    string GetData(int value);
}

[ServiceContract(Namespace = "X", Name = "TheContract")]//client side contract
public …
Run Code Online (Sandbox Code Playgroud)

wcf asynchronous task channelfactory task-parallel-library

7
推荐指数
1
解决办法
3936
查看次数