第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

有一組僅一次運(yùn)行X的任務(wù)

有一組僅一次運(yùn)行X的任務(wù)

C#
千萬(wàn)里不及你 2019-10-11 15:10:41
假設(shè)我有100項(xiàng)任務(wù)需要10秒鐘來(lái)完成。現(xiàn)在,我只想一次運(yùn)行10個(gè),例如這10個(gè)中的1個(gè)完成另一個(gè)任務(wù),直到全部完成?,F(xiàn)在,我總是使用ThreadPool.QueueUserWorkItem()這種任務(wù),但是我已經(jīng)讀到這樣做是不好的做法,應(yīng)該改用Tasks。我的問(wèn)題是,我在任何地方都找不到適合自己的案例的好例子,因此您可以讓我開始如何通過(guò)Tasks實(shí)現(xiàn)此目標(biāo)嗎?
查看完整描述

3 回答

?
拉丁的傳說(shuō)

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超8個(gè)贊

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

}


查看完整回答
反對(duì) 回復(fù) 2019-10-11
?
慕后森

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊

TPL Dataflow非常適合執(zhí)行此類操作。您可以輕松創(chuàng)建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;

}


查看完整回答
反對(duì) 回復(fù) 2019-10-11
?
阿波羅的戰(zhàn)車

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超6個(gè)贊

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


public void DoWork(IEnumerable<Action> actions)

{

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

        , actions.ToArray());

}

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


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功能是我更簡(jiǎn)單的實(shí)現(xiàn):


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;

    }

}


查看完整回答
反對(duì) 回復(fù) 2019-10-11
  • 3 回答
  • 0 關(guān)注
  • 352 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)