【问题标题】:Multiple threads of one type, one function [closed]一种类型的多个线程,一种功能[关闭]
【发布时间】:2013-02-02 14:11:22
【问题描述】:

首先我很抱歉,如果有另一个这样的线程,我没有看到它! 我的问题是:我想创建多个线程。但是这些线程必须执行相同的功能。 我怎样才能做到这一点? 像这样:

for(int i=0;i<20;i++)
{
  Thread t = new Thread(myFunction);
  t.Start();
}

有什么办法可以做到吗?

【问题讨论】:

  • 你的问题是什么?有没有抛出异常?
  • 确实工作。绝对会好的。现在告诉我们您的实际情况到底出了什么问题。
  • 您的代码将运行myFunction 20 次,每次都在不同的线程上。如果这是您想要的,那么只需编译您的代码并亲自查看。如果您希望在 20 个线程上并行化 一个 运行 myFunction,那么,那是另一回事了。无论如何,请更具体地说明您的问题。
  • 是的,Theodoros 这就是我想要的
  • @ЛюбославЛюбенов 我列举了两个可能的东西。你的意思是你想要第二个?由多个线程执行一次myFunction?如果是这种情况,您必须专门发布 myFunction 的代码,因为没有通用的方法来并行化任何代码。

标签: c# multithreading function for-loop


【解决方案1】:

为什么不使用任务?它也是异步的(因为我认为这就是你要找的东西。

for(int i=0;i<20;i++)
{
  Task task = new Task(new Action(myFunction));
  task.Start();
}

可以在这里找到区别:

What is the difference between task and thread?

【讨论】:

【解决方案2】:

我看不出你所拥有的有什么问题(也许如果你分享 myFunction 中的一些代码,我们可以得到更好的图片)。

我建议您使用 ThreadPool,或者使用 Task Parallel 库而不是手动创建自己的线程。

这里有一些技巧:

System.Threading.Tasks.Parallel.For(0, 20, myFunction); // myFunction should accept an int, and return void)

如果 myFunction 的签名不同,您可以使用 lambda 来“翻译”——请注意,您正在调用的函数在此处调用函数:

Parallel.For(0, 20, i => myFunction()); //(I could pass any param to my function in this example)

这是一种线程池方式

System.Threading.Threadpool.QueueUserWorkItem(myFunction) // myFunction needs to accept an object

//这里是如何使用任何签名将其排队到线程池中

ThreadPool.QueueUserWorkItem(s => myFunction());

另一个海报已经提到使用任务来做到这一点。如果你正在做的事情很简单,我会使用 Parallel.For。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    相关资源
    最近更新 更多