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或任何它是。还有什么我可以尝试的吗?
**注意,我无法改变事件的排序/处理/处理方式。这是一个非常固定的石头设计,我只需要解决它并或多或少地保持原样。
**更新
我也试过ParallelExtensionsExtras在OrderedTaskScheduler类中使用 ,但最终我仍然得到了我需要的变量的空引用。
当您需要Task生成一个值时,不要将结果设置为全局变量,而是将该结果Result作为任务的 ,并存储该任务。当其他一些代码稍后需要该结果时,它可以从任务中获取它。这将允许Task该类处理所有复杂的同步逻辑,防止在任务实际计算结果之前使用结果等。
当然,对于需要使用结果的事件,它大概不需要阻塞在该任务上,而是在任务完成后异步执行需要结果的其余代码。通过await在该任务上使用,这可以很容易地完成。如果您只使用 .NET 4.0,那么您可以ContinueWith显式使用。
| 归档时间: |
|
| 查看次数: |
4587 次 |
| 最近记录: |