亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有一組僅一次運行X的任務

有一組僅一次運行X的任務

C++
一只名叫tom的貓 2019-11-03 08:04:02
假設我有100項任務需要10秒鐘來完成?,F在,我只想一次運行10個,例如這10個中的1個完成另一個任務,直到全部完成。現在,我總是使用ThreadPool.QueueUserWorkItem()這種任務,但是我已經讀到這樣做是不好的做法,應該改用Tasks。我的問題是,我在任何地方都找不到適合自己的案例的好例子,因此您可以讓我開始如何通過Tasks實現此目標嗎?
查看完整描述

3 回答

?
慕田峪9158850

TA貢獻1794條經驗 獲得超8個贊

SemaphoreSlim maxThread = new SemaphoreSlim(10);


for (int i = 0; i < 115; i++)

{

    maxThread.Wait();

    Task.Factory.StartNew(() =>

        {

            //Your Works

        }

        , TaskCreationOptions.LongRunning)

    .ContinueWith( (task) => maxThread.Release() );

}



查看完整回答
反對 回復 2019-11-04
?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

TPL Dataflow非常適合執行此類操作。您可以輕松創建100%異步版本Parallel.Invoke:


async Task ProcessTenAtOnce<T>(IEnumerable<T> items, Func<T, Task> func)

{

    ExecutionDataflowBlockOptions edfbo = new ExecutionDataflowBlockOptions

    {

         MaxDegreeOfParallelism = 10

    };


    ActionBlock<T> ab = new ActionBlock<T>(func, edfbo);


    foreach (T item in items)

    {

         await ab.SendAsync(item);

    }


    ab.Complete();

    await ab.Completion;

}



查看完整回答
反對 回復 2019-11-04
?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

您有幾種選擇。您可以使用Parallel.Invoke入門:


public void DoWork(IEnumerable<Action> actions)

{

    Parallel.Invoke(new ParallelOptions() { MaxDegreeOfParallelism = 10 }

        , actions.ToArray());

}

這是一個替代選項,它將很難工作以恰好運行10個任務(盡管處理這些任務的線程池中的線程數可能不同),并Task在完成時返回指示,而不是直到完成才阻塞。


public Task DoWork(IList<Action> actions)

{

    List<Task> tasks = new List<Task>();

    int numWorkers = 10;

    int batchSize = (int)Math.Ceiling(actions.Count / (double)numWorkers);

    foreach (var batch in actions.Batch(actions.Count / 10))

    {

        tasks.Add(Task.Factory.StartNew(() =>

        {

            foreach (var action in batch)

            {

                action();

            }

        }));

    }


    return Task.WhenAll(tasks);

}

如果您沒有MoreLinq,則此Batch功能是我更簡單的實現:


public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> source, int batchSize)

{

    List<T> buffer = new List<T>(batchSize);


    foreach (T item in source)

    {

        buffer.Add(item);


        if (buffer.Count >= batchSize)

        {

            yield return buffer;

            buffer = new List<T>();

        }

    }

    if (buffer.Count >= 0)

    {

        yield return buffer;

    }

}



查看完整回答
反對 回復 2019-11-04
  • 3 回答
  • 0 關注
  • 484 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號