簡體   English   中英

將值參數傳遞給c#中的Task

[英]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.

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