[英]Passing value parameter to Task in c#
我有一個將long by值傳遞給Task的問題。
我有一個ID列表,我遍歷每個ID,分配給一個局部變量,然后作為參數傳遞給一個新的任務。 在循環並處理下一個ID之前,我不等待任務完成。 我保留了一系列任務,但這無關緊要。
loop
long ID = list[index];
task[index] = Task.Factory.StartNew(() => doWork(ID));
end loop
如果列表包含例如100和200.我希望第一個任務調用100,然后第二個任務調用200.但它沒有,doWork接收200兩個任務,因此復制值時出現問題。
我可以用一些簡單的控制台代碼演示
class Program
{
static void Main(string[] args)
{
long num = 100;
Task one = Task.Factory.StartNew(() => doWork(num));
num = 200;
Console.ReadKey();
}
public static void doWork(long val)
{
Console.WriteLine("Method called with {0}", val);
}
}
以上代碼將始終顯示
用200調用的方法
我修改了代碼以等待任務狀態從WaitingToRun切換
static void Main(string[] args)
{
long num = 100;
Task one = Task.Factory.StartNew(() => doWork(num));
while(one.Status == TaskStatus.WaitingToRun)
{}
num = 200;
Console.ReadKey();
}
這改善了事情,但不是100%證明,經過幾次運行,我得到了200調用方法
還嘗試了以下內容
while (true)
{
if (one.Status == TaskStatus.Running | one.IsCompleted == true)
break;
}
但再次顯示200。
任何想法如何保證傳遞給任務的價值而不等待任務完成?
任何幫助/建議贊賞Ade
任何想法如何保證傳遞給任務的價值而不等待任務完成?
當然 - 只需創建一個單獨的變量,在其他任何地方都不會修改。 您可以使用新范圍來明確:
long num = 100;
Task one;
{
// Nothing can change copyOfNum!
long copyOfNum = num;
one = Task.Factory.StartNew(() => doWork(copyOfNum));
}
您無法更改C#編譯器以捕獲“創建委托時變量的值”而不是捕獲變量,但您可以確保變量之后不會更改,從而完成相同的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.