我想從一個不同的線程更新UI元素,但我很明顯缺少與新的WPF調用有關的東西。多線程WPF與訪問器
在3.5的WinForms我不喜歡的東西在通過不同的線程更新時,我的UI如下:4.0 WPF現在
public string SummaryTitle
{
get
{
if (IsHandleCreated && InvokeRequired)
{
IAsyncResult result = BeginInvoke(new Func<object, object[], object>(GetType().GetProperty("SummaryTitle").GetValue), this, null);
return EndInvoke(result).ToString();
}
return myTextBox.Text.Trim();
}
set
{
if (IsHandleCreated && InvokeRequired)
{
BeginInvoke(new Action<object, object, object[]>(GetType().GetProperty("SummaryTitle").SetValue), this, value, null);
}
else
{
myTextBox.Text = value;
}
}
}
我試圖模仿以上,但隨着新的調度程序(也許有除了調度員之外,還有其他更好的方法嗎?)。這裏是原型代碼我與現在玩(我知道在它仍然nonthreading相關問題,請忽略現在),它是不工作的權利:
public string SomeText
{
get {
if(!myTextBox.Dispatcher.CheckAccess())
{
object o = myTextBox.Dispatcher.Invoke(new Func<object, object[], object>(GetType().GetProperty("SomeText").GetValue), this, null);
return o != null ? Convert.String(o) : "";
}
return myTextBox.Text.Trim();
}
set
{
if (!myTextBox.Dispatcher.CheckAccess())
{
myTextBox.Dispatcher.Invoke(new Action<object, object, object[]>(GetType().GetProperty("SomeText").SetValue),this, value, null);
return;
}
myTextBox.Text = value;
}
}
如何使WPF任何幫助訪問器函數類似於舊的3.5 winforms方法將不勝感激。
編輯:我正在尋找更多的辦法,使對用戶界面的訪問器屏幕元素線程安全比線程調用程序或具體進度。訪問者需要能夠從另一個程序集或類執行,而不管該調用類是使用Thread還是BackgroundWorker。此外,它需要爲所有UI元素保留水分,而不僅僅是一個進度條。所以文本框等也可以通過這種方式使線程安全。我更新了這些例子,以幫助更好地傳達我的煩惱。
感謝您的回覆。我目前正在使用背景工作,但是在另一個與上面鬆散耦合的類中。 bg worker是調用上述訪問器的'其他線程'。如果我在沒有調用重定向的情況下調用bgworker的上述訪問,那麼它會拋出你的普通「不能從另一個線程訪問進度條」類型的消息。所以,我試圖重新激活相同的訪問器,但是從當前正在執行的線程中,因爲當前正在執行的線程可能與GUI線程不同。 – 2010-10-12 13:32:08
@John - 不是試圖從DoWork事件/方法更新進度條,而是將BGWorker的WorkerReportsProgress屬性設置爲true,爲其ProgressChanged事件添加事件處理程序,並從DoWork事件處理程序中調用其ReportProgress方法。將用於更新ProgressBar的代碼放入ProgressChanged事件處理程序中。否則,由於您自己正在處理多線程部分,所以沒有任何理由將BackgroundWorker用於任何其他線程模型。 – 2010-10-12 13:49:58