Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以线程安全的方式调用函数_C#_.net 2.0 - Fatal编程技术网

C# 如何以线程安全的方式调用函数

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

在.NET2.0中,我一直在尝试以线程安全的方式安全地调用方法

我的treeview是通过调用单独线程上的数据库来填充的

下面是我尝试使用InvokeFunction方法(如下所示)…它是有效的,但我希望有更好的方法来编写它…对此有何想法

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线程同步。