我遇到了一個問題,即集合中的第一個項目正在響應更新,但沒有其他項目(滿分爲40)。我看了一遍網絡尋找答案,但不幸的是,在幾天之後,我仍然沒有得到任何幫助。螺紋應用程序問題
揭開序幕一個線程用於檢測循環調用代碼:
_detectionThread = new Thread(() => _x.StartDetection());
_detectionThread.Start();
Ive得到了我的助手類的一個下面的代碼簡單地投票和當檢測到的東西,通過事件的方式視圖模型被稱爲:
public event EventHandler SomethingIsDetected;
private void OnSomethingDetected()
{
if (SomethingIsDetected!= null)
{
SomethingIsDetected(this, new EventArgs());
}
}
代碼檢測迴路:
var startCheckTime = DateTime.Now;
var nextCheck = startCheckTime.AddSeconds(PollingInterval.TotalSeconds);
while (_performDetection)
{
startCheckTime = DateTime.Now;
if (startCheckTime >= nextCheck)
{
nextCheck = startCheckTime.AddSeconds(PollingInterval.TotalSeconds);
{
var detectionTask = Task.Factory.StartNew(() => IsXConnected());
IsXPresent = detectionTask.Result;
Thread.Sleep(TimeSpan.FromSeconds(1));
if (IsXPresent)
{
Application.Current.Dispatcher.Invoke(new Action(OnSomethingDetected));
}
}
}
Thread.Sleep(10);
}
更新項目的代碼。視圖綁定到這裏的屬性(特別是CurrentItem)。項目是一個ObservableCollection
foreach (var item in Items) //loop through 40 items
{
//do some operation then set the current item
Application.Current.Dispatcher.Invoke(new Action(() => CurrentItem = item));
}
雖然林步進通過(與調試器的幫助下)我注意到,該項目被udpated只是第一次。剩下的只是循環。我用一個DependencyProperty設置屬性CurrentItem。
我曾嘗試使用CheckAccess來使用Delegate和udpate屬性,並沒有幫助。
任何幫助,歡迎和感謝!
1)何苦因爲您在下一行阻塞,所以創建一個調用IsXConnected的任務,直到操作完成。 2)什麼是IsXConnected在做什麼?既然這就是我在第一個結果後返回錯誤,這似乎很重要。3)我意識到foreach循環中有一些代碼設置CurrentItem = item,但是一開始它並沒有任何意義,因爲除非有阻塞調用,否則它會很快通過所有的Items和CurrentItem將最終成爲Items.Last,這將是UI將會看到的唯一的東西。 –
感謝您的保羅,我得到了一個UI更新位的Debug.WriteLine,這表明只有第一個項目正在調用更新位。 (即使通過調用方法來處理點1,而沒有任務)。 – TheRenoRanger
我相信從MainWindow.XAML.cs的構造函數執行線程是罪魁禍首。簽出[這](http://stackoverflow.com/questions/6639237/wpf-custom-control-dependencyproperty-issue)發佈更多信息。 – TheRenoRanger