【问题标题】:Fetching data of a background task from main thread从主线程获取后台任务的数据
【发布时间】:2015-11-17 03:27:50
【问题描述】:

这里有一个全局变量,用于存储 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 的值时,使用Check_Click 方法完成时总是返回-1。但线程仍在运行。为什么会这样?如何在不使变量变为静态的情况下获得计数值?

【问题讨论】:

  • 此代码按您的预期工作。您确定在“单击”检查之前“单击”运行吗?即在尝试检查更改后的 myCount 值之前,该任务实际上需要运行。
  • 是的,我在检查之前点击了运行。当线程休眠 1 秒时,它不会很快用完循环
  • 尝试发布一个完整的例子,也许是一个要点。我使用 WinForms 应用程序创建了简单的测试用例,并使用上面的确切代码,它可以按您的预期工作。
  • 我也在 Windows 窗体应用程序中尝试了确切的代码...但是 myCount 值在单击“检查”按钮时始终显示 -1。你尝试将变量设为静态

标签: c# parallel-processing task-parallel-library


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    相关资源
    最近更新 更多