【问题标题】:C# winforms multithread on method with parametersC# winforms 带参数的方法上的多线程
【发布时间】:2014-07-13 22:35:26
【问题描述】:

我有一个带有 3 个参数的方法,我想为它创建一个线程。我知道如何为没有任何参数和对象类型参数的方法创建线程。方法头是:

public void LoadData(DataGridView d, RadioButton rb1, RadioButton rb2){
//} 

【问题讨论】:

  • 您阅读文档了吗?通过 Thread 类使用:msdn.microsoft.com/en-us/library/6x4c42hc(v=vs.110).aspx。使用线程池(推荐方法):msdn.microsoft.com/en-us/library/4yd16hza(v=vs.110).aspx。您的“状态”参数是您要传递给它的参数。您将(对于这两种方法)对象转换为实际所需的对象。
  • 可以使用ParameterizedThreadStart创建参数化线程。
  • @Ahmedilyas,​​我阅读了部分文档,但不是全部:-(
  • @Shell,我对复杂的多线程了解不多,我知道我们可以使用对象类型(不安全)和安全,包括使用构造函数。如果你能帮我解决这个问题,我真的很感激。
  • 嘿,首先,您使用的是什么 .Net?如果稍后 4.0 考虑使用 Task,如果更早,问问自己,你想要一个线程池中的线程,还是创建一个你必须自己管理(意味着杀死)的新线程。

标签: c# multithreading


【解决方案1】:

除了Tzah的回答,你没有提到线程生命周期和管理。这是一个思考的好地方——只要你写出高质量的代码..

如果您使用线程池中的线程,具有 3 个或更多参数,请使用我之前的答案:C# - ThreadPool QueueUserWorkItem Use?

如果您使用的是 .Net 4.0+,请考虑使用 Tasks

【讨论】:

  • 方法完成任务后线程完成了怎么办?
  • 您创建了 Thread 类,这是一个对象,您调用了 Start,它运行一些代码并完成(停止运行代码),线程类仍然存在,谁在处理它。如果它持有对非托管资源的引用或调用类具有长时间运行的正常运行时间,这可能会导致严重的内存泄漏
  • 那是我没有考虑的smt。你有什么建议吗?
  • 我想在耗时的方法上创建一个新线程或任务,将数据加载到gridView中。我想在保持 UI 正常工作的同时加载数据。你仍然认为任务是最好的选择吗?
  • 什么是长时间运行?定义它。另外我不是客户端开发人员,你能从工作线程更新gridview(GUI)吗?我想你会得到例外
【解决方案2】:

你可以像这样使用Lambda Expression

new Thread(() => LoadData(var1, var2, var3)).Start();

Thread T1 = new Thread(() => LoadData(var1, var2, var3));
T1.Start();

【讨论】:

  • 感谢您的回答。您能否发布 var1、var2 和 var3 应该在哪里?
  • @isidoro var1,var & var3 只是占位符。以与无线程调用函数相同的方式使用变量
  • 你的意思是这样吗:Thread T1 = new Thread(() => LoadData([dgv], [rb1], [rb2])).Start();
  • 是的,像这样,除了方括号。
  • @isidoro Lambda 表达式与正则表达式不同:)。是的,您可以使用ParameterizedThreadStart,但使用 lambda 会更快、更干净
【解决方案3】:

由于 Tzah 的回答肯定会奏效,因此在 .NET Framework 中使用线程的推荐方式现在使用 Task Parallel Library。 TPL 提供了对ThreadPool 的抽象,它管理一个线程池供我们使用,而不是创建和销毁,这具有不可忽视的成本。它们可能不适合所有类型的卸载工作(例如运行时间很长的 CPU 消耗任务),但它们肯定会涵盖大多数情况。

与您使用 TPL 的请求等效的示例是使用 Task.Run

Task task = Task.Run(() => LoadData(var1, var2, var3));

【讨论】:

  • 感谢您的回答。我的问题是将数据加载到 gridView 中,长时间的任务不应该影响 UI 的功能。
  • 该任务不会影响您的 UI 的响应能力。
  • 那么,如果 LoadData() 使 UI 在运行时无响应,task 可以帮助解决它吗?
  • Task.Run 将使用 ThreadPool 线程来执行委托。所以是的,它会解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2011-06-24
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多