我有一个由事件处理程序启动的函数。在此函数中,将创建一个新任务,然后运行该任务以设置稍后将在另一个事件处理程序中设置的全局变量。
这两个之间还有另外两个函数,它们不会更改这些函数中使用的任何变量。但是,这看起来像是这样。
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);
}
我遇到了竞争条件,_variableIneed
在第二个事件处理程序中我需要的变量为null,而不能为null。如果我没有经过并尝试创建足够的事件以使wpf程序崩溃,它会很好地工作,但是即使这样做,我也需要它工作。
我有什么办法可以克服这些比赛条件?
我试过使用.ContinueWith
带有OnlyOnRanToCompletion
或的选项。还有其他我可以尝试的方法吗?
**请注意,我无法更改事件的排序/处理/处理方式。这是石材设计中的漂亮设置,我只需要解决它,并或多或少地保持它的状态即可。
**更新
我也尝试过ParallelExtensionsExtras
在OrderedTaskScheduler
类中使用,但最终仍无法获得所需变量的空引用。
当您Task
要生成一个值时,请勿将结果设置为全局变量,而要将该结果作为Result
任务的并存储该任务。当稍后需要其他一些代码时,可以从任务中获取它。这将允许Task
类处理所有复杂的同步逻辑,防止在任务实际计算结果之前使用结果,等等。
当然,对于需要使用结果的事件,它大概不需要阻塞该任务,而是在任务完成后异步执行需要结果的其余代码。通过await
在该任务上使用,可以很容易地做到这一点。如果仅使用.NET 4.0,则可以ContinueWith
显式使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句