2015-11-16 37 views
1

这里我有一个全局变量,它存储for循环的索引。这是一个漫长的过程,所以每个都在Task内完成。在Task里面,索引值被存储到一个变量中。在后台进程运行时,我有另一种从全局变量中获取值的方法。但它返回不正确。从主线程获取后台任务的数据

int myCount = -1; 
Task BackgroundTask; 
List<int> Count = new List<int>(); 

protected void Run_Click(object sender, EventArgs e) 
{ 
    BackgroundTask = new Task(() => 
     { 
      for (int i = 0; i < 1000000; i++) 
      { 
       myCount = myCount + 1; 
       Thread.Sleep(1000); 
      } 
     }); 
    BackgroundTask.Start(); 
} 

protected void Check_Click(object sender, EventArgs e) 
{ 
    Count.Add(myCount);    
} 

这里同时访问变量myCount的值总是返回-1当与Check_Click方法完成。但线程仍在运行。为什么会这样,以及如何在不使变量静态的情况下获得计数值?

+1

此代码按照您的意图工作。您是否确定在“点击”检查之前“点击”运行?即,在尝试检查修改后的“myCount”值之前,实际上需要运行该任务。 – Xenolightning

+0

是的,我已经点击了check.and之前运行,因为线程睡了1秒,它不会快速运行循环 – Intruder

+0

尝试发布一个完整的例子,也许在一个要点。我使用WinForms应用程序创建了简单的测试用例,并使用上面的确切代码,它可以按照您的预期工作。 – Xenolightning

回答

0

它似乎与编译器优化有关。尝试使用volatile关键字标记索引变量定义,通知编译器有关多个线程将访问该变量的事实。

volatile int myCount = -1; 
Task BackgroundTask; 
//rest of the code 
+0

nope,也没有工作 – Intruder

相关问题