![](/img/trans.png)
[英]Cannot implicitly convert type 'void' to '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.