任务和全局变量 C#

B-M*_*B-M 2 c# wpf scheduled-tasks

我有一个由事件处理程序启动的函数。在这个函数中,一个新任务被创建并运行以设置一个我稍后需要的全局变量,在另一个事件处理程序中。

这两个函数之间还有其他几个函数,它们不会更改其中使用的任何变量。但这就是它的样子。

private void EventWhereINeedTheGlobalVariableLater(object sender, Event e)
{
    //...work...

    need _variableIneed


    //....more work...
}


private void EventWhereISetGlobalVariable(object sender, Event e)
{
    //....work....
    //...make cancellationToken...
    //groups, isCommonalityGroup are other global variables already set. 

    Task.Factory.StartNew(() =>
    {
        // Clear variable to get new value
        _variableIneed = null;

        // Execute query to get new value
        _variableIneed = _workingManager.GetValue(groups, isCommonalityGroup, cancellationToken);

       RefreshView();

    }, cancellationToken);
}
Run Code Online (Sandbox Code Playgroud)

我遇到了竞争条件,我需要的变量_variableIneed在第二个事件处理程序中为空,而它不能。如果我没有飞过并试图创建足够的事件来使 wpf 程序崩溃,它就可以正常工作,但是即使我这样做了,我也需要它工作。

我能做些什么来克服这些竞争条件吗?

我试过使用 的.ContinueWith选项OnlyOnRanToCompletion或任何它是。还有什么我可以尝试的吗?

**注意,我无法改变事件的排序/处理/处理方式。这是一个非常固定的石头设计,我只需要解决它并或多或少地保持原样。

**更新

我也试过ParallelExtensionsExtrasOrderedTaskScheduler类中使用 ,但最终我仍然得到了我需要的变量的空引用。

Ser*_*rvy 5

当您需要Task生成一个值时,不要将结果设置为全局变量,而是将该结果Result作为任务的 ,并存储该任务。当其他一些代码稍后需要该结果时,它可以从任务中获取它。这将允许Task该类处理所有复杂的同步逻辑,防止在任务实际计算结果之前使用结果等。

当然,对于需要使用结果的事件,它大概不需要阻塞在该任务上,而是在任务完成后异步执行需要结果的其余代码。通过await在该任务上使用,这可以很容易地完成。如果您只使用 .NET 4.0,那么您可以ContinueWith显式使用。