2011-10-31 22 views
0

我正在使用下面的代碼。調用線程無法訪問此對象,因爲不同的線程擁有它

public partial class SettingApp 
{ 
    public SettingApp() 
    { 
     InitializeComponent(); 
     Parallel.Invoke(SetDataInTextBox); 
    } 

    private void SetDataInTextBox() 
    { 
     txtIncAns.Text = Properties.Settings.Default.IncludeAN; 
     txtIncAuthor.Text = Properties.Settings.Default.IncludeAutt; 
     txtIncQuo.Text = Properties.Settings.Default.IncludeQU; 
     txtIncSpBegin.Text = Properties.Settings.Default.IncludeSP; 
    } 
} 

程序提供了以下錯誤

調用線程,因爲不同的

線程擁有它不能訪問該對象。

這是正確的方式

更新:

這是否是正確的:

public partial class SettingApp 
{ 
    private delegate void SetDataInTextBoxDelegate(); 
    public SettingApp() 
    { 
     InitializeComponent(); 

     txtIncAns.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new SetDataInTextBoxDelegate(SetDataInTextBox)); 
    } 

    private void SetDataInTextBox() 
    { 
     txtIncAns.Text = Properties.Settings.Default.IncludeAN; 
     txtIncAuthor.Text = Properties.Settings.Default.IncludeAutt; 
     txtIncQuo.Text = Properties.Settings.Default.IncludeQU; 
     txtIncSpBegin.Text = Properties.Settings.Default.IncludeSP; 
    } 
} 
+0

現在您已經移除了'Parallel.Invoke'調用,它是否全部都在UI線程上運行?如果是這樣,你不需要在控件上調用'Invoke'。 –

+0

請讓我看看正確的方式 – mrJack

回答

2

只有UI線程可以訪問UI元素,我猜是那些東西是什麼txtParallel.Invoke在您的情況下不是UI線程,因此當您嘗試訪問控件上的.Text屬性時引發異常。

您需要將調用封送到UI線程。在的WinForms,控制有不同的方式來幫助你做到這一點:

if (myControl.InvokeRequired) 
{ 
    myControl.Invoke(...); 
} 
else 
{ 
    myControl.Text = "something"; 
} 

MSDN與實例的文章在這裏(VS2010):

http://msdn.microsoft.com/en-us/library/757y83z4(v=VS.100).aspx

更新1:

對於WPF模型是類似的,但包括Dispatcher:

myControl.Dispatcher.Invoke(...); 

更新2:當然,它看起來像你甚至不需要在這裏使用多線程代碼。我猜想使用多線程部分的開銷比您最終調用的代碼更多。簡單地除去從本節中使用多個線程的和直接設置屬性:

public SettingApp() 
    { 
     InitializeComponent(); 
     SetDataInTextBox(); 
    } 

    private void SetDataInTextBox() 
    { 
     txtIncAns.Text = Properties.Settings.Default.IncludeAN; 
     txtIncAuthor.Text = Properties.Settings.Default.IncludeAutt; 
     txtIncQuo.Text = Properties.Settings.Default.IncludeQU; 
     txtIncSpBegin.Text = Properties.Settings.Default.IncludeSP; 
    } 
+0

我正在使用WPF – mrJack

+0

@mrJack同樣的故事,我已經更新了我的答案。 –

1

正如亞當說,只有UI線程可以訪問用戶界面元素。在WPF的情況下,你會使用myControl.Dispatcher.Invoke()

因爲這些調用都將在UI線程上調用,所以您應該刪除Parallel.Invoke()並直接調用該方法。

0

只是一個替代建議。我會轉向將數據綁定到一個類的屬性,即使你不想去完整的MVVM設計,數據綁定是你在WPF中的朋友。然後,如果你需要線程,當屬性發生變化時,WPF將處理UI線程上的更新控件,即使在另一個線程上更改屬性時也是如此。

相關問題