簡體   English   中英

C#無法從'void'轉換為'System.Threading.Tasks.Task

[英]C# Cannot convert from 'void' to 'System.Threading.Tasks.Task

搜索之后,我沒有找到與我的問題相關的主題,因此請按以下步驟進行:

由於我們要調用的服務有限,我們計划每次並行觸發一個預定數量的服務請求。 代碼是:

        public static void RunConcurrentThreads(List<Item> list, Action<Item> action, int nNumberOfConcurrentThreads = 3)
    {
        for (int i = 0; i < list.Count; i++)
        {

            var taskList = new List<Task>();

            for (int j = 0; j < nNumberOfConcurrentThreads; j++)
            {
                if (i + j < list.Count)
                {
                    taskList.Add(action(list[i + j]));
                }
                else
                {
                    break;
                }
            }

            if (taskList.Count > 0)
            {
                Task.WaitAll(taskList.ToArray());
            }

            i = i + nNumberOfConcurrentThreads;
        }
    }

“ Item”是一個類,定義了我們要處理的對象。

“操作”用於將一個Item對象作為參數的void方法。 該方法將調用服務,然后將返回的信息保存到數據庫。 完成大約需要0.5-1秒。

nNumberOfConcurrentThreads是每次將觸發的並發請求數。

該行顯示標題錯誤

taskList.Add(action(list [i + j]));

那么如何解決錯誤? 還是有更好的方法來處理此類並發問題?

謝謝。

Microsoft已使用任務並行庫為您完成了工作。

只需使用Parallel.ForEach ,它就很簡單。

using System.Threading.Tasks;

static void RunConcurrentThreads(List<Item> list, Action<Item> action, int nNumberOfConcurrentThreads = 3)
{
    Parallel.ForEach
    (
        list,
        new ParallelOptions { MaxDegreeOfParallelism = nNumberOfConcurrentThreads  }
        i => action(i)
    );
}

雖然這看起來像一個循環,但實際上,運行時將為每次迭代創建一個線程(達到指定的限制)並並行運行它們。

Action不返回任何東西。 如果要在Task運行它,則需要調用Task.Run ,它開始在單獨的線程中運行該操作並返回任務:

taskList.Add(Task.Run(() => action(list[i + j]));

暫無
暫無

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

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