我想从另一个线程访问我的程序中的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