【问题标题】:How Implement Thread Within Another Thread in c#c#如何在另一个线程中实现线程
【发布时间】:2018-04-16 09:28:02
【问题描述】:

场景:有一个请求和许多供应商,所以为了从我使用的所有供应商那里获取结果,

var supplierResults = suppliers.AsParallel()
                           .WithDegreeOfParallelism(suppliers.Count())
                           .Select(supplier => supplier.GetResponse(request, SuppliersRequestTimespan))
                           .ToArray(); 

                    Task.WaitAll(supplierResults);

哪个工作正常。

在另一个场景中,我有三个不同的请求,并希望同时将其发送给所有供应商(线程)。我只是尝试如下:

int TaskCount = 3;
var tasks = new Task[TaskCount];

tasks[0] = Task.Factory.StartNew(() => (suppliers.AsParallel()
                                            .WithDegreeOfParallelism(suppliers.Count())
                                            .Select(supplier => supplier.GetResponse(request1, SuppliersRequestTimespan))
                                            .ToArray()));
tasks[1] = Task.Factory.StartNew(() => (suppliers.AsParallel()
                                                .WithDegreeOfParallelism(suppliers.Count())
                                                .Select(supplier => supplier.GetResponse(request2, SuppliersRequestTimespan))
                                                .ToArray()));
 tasks[2] = Task.Factory.StartNew(() => (suppliers.AsParallel()
                                                .WithDegreeOfParallelism(suppliers.Count())
                                                .Select(supplier => supplier.GetResponse(request3, SuppliersRequestTimespan))
                                                .ToArray()));

 Task.WaitAll(tasks);

但是,不幸的是,它没有“等待”响应。

GetResponse() 方法来自如下界面:

 public interface ISupplier
    {
        Task<JObject> GetResponse(JObject request, TimeSpan timeout);

        Task<JObject> GetResponseAsync(JObject request, TimeSpan timeout);
        string GetSupplierBrand();
        string GetSupplierCulture();
    }

希望你们帮我完成这个..

【问题讨论】:

  • supplier.GetResponse() 方法是异步的吗?这会导致您的控件在所有实际任务未完成的情况下返回。此外, .ToArray() 似乎位于奇怪的位置。检查为什么你不能像那个有效的那样拥有它。
  • @HenkHolterman GetResponse() 来自如上图所示的界面。
  • 你真的应该使用微软的响应式框架来处理这种事情。

标签: c# asp.net multithreading


【解决方案1】:

为此尝试使用 Microsoft 的响应式框架。

主要代码如下:

var requests = new[] { request1, request2, request3 };

var query =
    from supplier in suppliers.ToObservable()
    from request in requests.ToObservable()
    from response in Observable.FromAsync(() =>
        supplier.GetResponseAsync(request, SuppliersRequestTimespan))
    select new { supplier, request, response };

现在,如果您想以数组的形式获取所有结果,只需调用以下代码:

var results = query.ToArray().Wait();

但是你总是可以使用响应式框架来获得每个结果,只要这样做:

var subscription =
    query
        .Subscribe(result =>
        {
            // Do something with each result
        });

所有这些都是多线程的,并且使用了最大数量的可用线程。

这几乎太简单了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    相关资源
    最近更新 更多