我想從另一個線程訪問我的程序中的3個列表框元素,並不斷收到交叉線程異常。我需要一種方法從另一個線程訪問我的列表框,並將該代碼放在一個名爲threadUtilities.cs的單獨類中。這樣,我所有的線程訪問相關的代碼將在一個單獨的類。任何人都可以提供通用代碼來訪問另一個線程的任何列表框?C#:Listbox CrossThreading問題
0
A
回答
1
取決於它是WinForms還是WPF。如果WinForms,請使用Control.Invoke方法。如果是WPF,請使用Dispatcher。
簡單的WinForms示例:
ListBox listBox = GetListBoxFromSomewhere();
if(listBox.InvokeRequired)
listBox.Invoke(() => listBox.Items.Add("Some item");
else
listBox.Items.Add("Some item");
你可以做的UI訪問的通用功能,像這樣:
void PerformUIOperation(Control c, Action action)
{
if(c.InvokeRequired)
c.Invoke(action);
else
action();
}
使用這樣的:
PerformUIOperation(listBox,() => listBox.Items.Add("Some item");
2
你想要得到的SynchronizationContext
從UI線程,然後使其可用於後臺線程。
根據您使用的是什麼技術,導出SynchronizationContext
將會變得可用,但那不是真正關心的問題; Current
property將返回當前安裝的那個,Windows窗體和WPF將爲您安裝適當的一個。
隨着SynchronizationContext
傳遞給你想撥打電話的,然後你可以調用Send
method(類似於Invoke
method)或Post
method(類似於BeginInvoke
method)根據您的需要線程。
下面是一個例子:
public void Button1_OnClick(sender object, EventArgs e)
{
// Get the current SynchronizationContext.
// NOTE: Must make the call on the UI thread, NOT
// the background thread to get the proper
// context.
SynchronizationContext context = SynchronizationContext.Current;
// Start some work on a new Task (4.0)
Task.Factory.StartNew(() => {
// Do some lengthy operation.
...
// Notify the user. Do not need to wait.
context.Post(o => MessageBox.Show("Progress"));
// Do some more stuff.
...
// Wait on result.
// Notify the user.
context.Send(o => MessageBox.Show("Progress, waiting on OK"));
});
}
而且,應該提到的是,BackgroundWorker
class做這一切爲你在幕後;如果這種模式直接適用於SynchronizationContext
,那麼請使用它(BackgroundWorker
類內部使用SynchronizationContext
)。
相關問題
- 1. C#ListBox的問題
- 2. 標籤問題c#listbox
- 3. C#listbox數組問題
- 4. C#Listbox/foreach循環問題
- 5. ListBox Winform問題
- 6. VBA listbox問題
- 7. asp.net listbox問題
- 8. DrawingGroup - crossthreading
- 9. WPF ListBox SelectedItem問題
- 10. System.string []/listbox問題VB.NET
- 11. Listbox selecteditem問題wpf
- 12. Listbox ScrollIntoView問題wpf
- 13. .Net Listbox DataBinding問題
- 14. ListBox PreviewMouseLeftButtonDown DataTemplate問題
- 15. .NET crossthreading麻煩
- 16. Silverlight Listbox與ListBox性能問題
- 17. 使用BackgroundWorker和statusstrip更新的CrossThreading問題
- 18. WPF ListBox DataTemplate和Image問題
- 19. 多選問題wp7 listbox
- 20. ListBox的模板有問題
- 21. WPF Listbox綁定問題
- 22. C#Winforms將ListBox控件綁定到DataTable問題
- 23. 在ListBox中添加項目時,BackgroundWorker在C#中給出問題?
- 24. WP7上的ListBox問題 - 發生System.Windows.Markup.XamlParseException
- 25. Wpf listbox調整大小問題
- 26. 更新WPF中ListBox控件的問題
- 27. 在ASP.Net中選擇ListBox selectedindex的問題:
- 28. WPF ListBox自定義控件問題
- 29. ZK Bandbox Listbox autoPaging問題與過濾
- 30. ListBox內的WPF圖表問題
wpf或winforms? – Jodrell 2011-06-06 14:20:09