簡體   English   中英

如何在c#中的另一個線程內實現線程

[英]How Implement Thread Within Another Thread in c#

場景:有一個請求並且有很多供應商,所以為了從我使用的所有供應商那里獲得結果,

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();
    }

希望你們幫我完成這個任務。

嘗試為此使用Microsoft的Reactive Framework。

這是主要代碼:

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();

但是,您始終可以使用Reactive Framework盡快獲得每個結果。只需執行以下操作:

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

所有這些都是多線程的,並使用最大數量的可用線程。

這太簡單了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM