我有一個由事件處理程序啓動的函數。在這個函數中,一個新的任務被創建並運行,以便在其他事件處理程序中設置一個稍後需要的全局變量。任務和全局變量c#
這兩者之間還有一些其他功能,它們不會更改這些內部使用的任何變量。但是這就是這樣的樣子。
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
變量是第二個事件處理程序中無效,它不能。如果我沒有通過並嘗試創建足夠的事件來崩潰wpf程序,它會正常工作,但即使我這樣做,我也需要它。
我能做些什麼來克服這些競爭條件?
我試過使用.ContinueWith
,選項OnlyOnRanToCompletion
或任何它。任何其他的事情,我可以嘗試?
**注意我不能通過改變事件的排序/處理/工作方式來做很多事情。這是一個非常漂亮的石頭設計,我只需要解決它,並保持它或多或少。
**更新
我已經使用ParallelExtensionsExtras
與OrderedTaskScheduler
類也試過,我還是最終得到的變量,我需要一個空引用。
如果在EventWhereISetGlobalVariable處理程序中設置變量之前調用EventWhereINeedTheGlobalVariableLater處理函數,那麼您就無能爲力。 – Sheridan 2014-09-24 14:10:59
你的意思是你在'EventWhereINeedTheGlobalVariableLater'中得到空嗎?可能「任務」沒有完成?你需要同步它。 – 2014-09-24 14:11:52
是@SriramSakthivel我得到一個空值爲我需要的全局變量。 – 2014-09-24 14:13:41