C# 如何以线程安全的方式调用函数
在.NET2.0中,我一直在尝试以线程安全的方式安全地调用方法 我的treeview是通过调用单独线程上的数据库来填充的 下面是我尝试使用InvokeFunction方法(如下所示)…它是有效的,但我希望有更好的方法来编写它…对此有何想法C# 如何以线程安全的方式调用函数,c#,.net-2.0,C#,.net 2.0,在.NET2.0中,我一直在尝试以线程安全的方式安全地调用方法 我的treeview是通过调用单独线程上的数据库来填充的 下面是我尝试使用InvokeFunction方法(如下所示)…它是有效的,但我希望有更好的方法来编写它…对此有何想法 InvokeFunction(delegate() { TreeView1.Nodes.Clear(); }); delegate void FunctionDelegate(); private delegate void ThreadSafeProc
InvokeFunction(delegate() { TreeView1.Nodes.Clear(); });
delegate void FunctionDelegate();
private delegate void ThreadSafeProcess(FunctionDelegate func);
private void InvokeFunction(FunctionDelegate func)
{
if (this.InvokeRequired)
{
ThreadSafeProcess d = new ThreadSafeProcess(InvokeFunction);
this.Invoke(d, new object[] { func });
}
else
{
func();
}
}
除非您共享某些状态,否则您不必担心abbout线程的安全性。函数总是在堆栈上接收它们的参数,每个线程的堆栈都是本地的。所以函数不是你的问题。相反,关注国家。“TreeView1”对象是一个值得担心的候选对象
BackgroundWorker
是.NET2.0中一个更干净的解决方案。
它将为您创建一个线程并负责同步
您可以在设计模式中将BackgroundWorker
组件添加到表单中。
您可以订阅DoWork
活动。当您在UI线程中调用backgroundWorker.RunWorkerAsync()
时,此订阅的方法将在后台线程中执行
当您需要从后台线程与UI线程交互时,可以调用backgroundWorker.ReportProgress
。
这将触发ProgressChanged
事件<代码>进度更改事件始终在UI线程中执行。
您可以使用backgroundWorker.ReportProgress
的userState
参数将任何数据传递给UI线程。例如,在您的示例中,添加新的TreeView
节点所需的数据。
实际上,您将在ProgressChanged
事件处理程序中添加新节点
以下是指向MSDN的链接:
请记住,您不必使用方法
ReportProgress
的percentProgress
参数。尽管当您有一个进度条来反映后台工作进度时,这是很方便的。除非您详细说明您的功能,否则无法回答此问题。有许多不同的同步机制可用于解决不同的问题。哪一个是合适的取决于手头的问题。您的问题是什么?David,正如您所看到的,该函数正在调用treeview方法clear nodes()。我只是想创建一些比显式调用forms.control方法更通用的方法。我假设这是WinForms。Brad说:“我的treeview是通过调用单独线程上的数据库来填充的。”。TreeView不应从UI线程以外的任何其他线程访问。因此,这里需要UI线程同步。