【问题标题】:How to handle request in multi-threading using task?如何使用任务处理多线程中的请求?
【发布时间】:2018-07-31 13:29:15
【问题描述】:

嗨,我有一个 List<List<string>> 假设我们说它是 batchList 现在我想先处理四个批次,然后再处理另外两个批次,我该如何实现这一目标

代码如下:

List<List<string>> termsBatches = searchTerms.Split(2).ToList(); //batchList Count is 6
List<Task> taskList = new List<Task>(); //initialize task list for wait
foreach (List<string> batch in termsBatches)
{

 Task<SolrSearchResults> task = Task<SolrSearchResults>.Factory.StartNew(()=>
 {
      //Do Somethisng
 });

 taskList.Add(task);
 Task.WhenAll(taskList.ToArray());
 foreach (Task<SolrSearchResults> result in taskList)
 {
      //Process result
 }

}

处理完四个请求的结果后,我想触发另外两个请求,我该如何实现呢?

【问题讨论】:

  • 你能解释得更清楚吗?我不明白你想要什么?
  • 我会按照我的理解来描述你的任务。请您确认这种理解是对还是错。 >> 您有 6 个要处理的项目的集合。您想首先处理前 4 个项目 - 以异步方式与 4 个独立任务。然后,在完成所有这 4 项之后,2 个独立异步任务中的最后 2 项。

标签: c# asp.net multithreading


【解决方案1】:

如果您想在项目到达时对其进行处理并使用多线程,那么您应该考虑使用 Microsoft 的 Reactive Framework (NuGet "System.Reactive")。

那么,假设你有一个方法Task&lt;SolrSearchResults&gt; GetSolrSearchResults(List&lt;string&gt; batch),你可以这样做:

List<List<string>> termsBatches = new List<List<string>>()
{
    new List<string>() { "apple", "banana" },
    new List<string>() { "cat", "dog" },
};

IObservable<SolrSearchResults> query =
    from batch in termsBatches.ToObservable()
    from result in Observable.FromAsync(() => GetSolrSearchResults(batch))
    select result;

IDisposable subscription =
    query
        .Subscribe(result =>
        {
            //Process result
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 2020-04-15
    • 2021-04-09
    相关资源
    最近更新 更多