如何在c#中使用线程池?
当我运行此代码时,控制台上不会显示任何内容,但当我调试时,它会显示输出。请解释为什么会发生这种情况?线程完成任务时如何获取信息如何在c#中使用线程池?,c#,C#,当我运行此代码时,控制台上不会显示任何内容,但当我调试时,它会显示输出。请解释为什么会发生这种情况?线程完成任务时如何获取信息 public class TestClass { static void Main() { ThreadPool.SetMaxThreads(5, 5); for (int x = 0; x < 10; x++) { ThreadPool.QueueUserWorkItem(n
public class TestClass
{
static void Main()
{
ThreadPool.SetMaxThreads(5, 5);
for (int x = 0; x < 10; x++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(printnum), x);
}
Console.ReadKey();
}
public static void printnum(object n)
{
Console.WriteLine("Call " + n);
for (int i = 0; i < 10; i++) { Console.WriteLine(i); }
}
}
公共类TestClass
{
静态void Main()
{
线程池.SetMaxThreads(5,5);
对于(int x=0;x<10;x++)
{
QueueUserWorkItem(新的WaitCallback(printnum),x);
}
Console.ReadKey();
}
公共静态void printnum(对象n)
{
控制台写入线(“呼叫”+n);
对于(inti=0;i<10;i++){Console.WriteLine(i);}
}
}
来自控制台。ReadKey()
:
ReadKey方法等待,即在发出
ReadKey方法,直到按下字符或功能键
它实际上是在控制台.InternalSyncObject
上获取一个锁,这会阻止控制台上的进一步操作
Console.ReadLine()
方法不会以这种方式阻止线程。你可以用它来代替
阅读我猜你已经安装了.NET4.5了?其他人是对的。如果不等待线程完成,则需要使用Console.ReadLine。但如果您按照要求等待,您仍然可以使用Console.ReadKey。我相应地更改了您的代码。还可以在上查看Microsofts示例
static void Main(字符串[]args)
{
常数int计数=10;
var waitHandles=新的手动重置事件[计数];
线程池.SetMaxThreads(5,5);
对于(int x=0;x
关键是你必须使用WaitHandles。每个线程获得一个句柄,该句柄在线程完成时设置为true。在main方法中,您必须等待所有句柄都设置为true。谢谢Daniel。我如何知道线程何时完成任务?看一看
static void Main(string[] args)
{
const int count = 10;
var waitHandles = new ManualResetEvent[count];
ThreadPool.SetMaxThreads(5, 5);
for (int x = 0; x < count; x++)
{
var handle = new ManualResetEvent(false);
waitHandles[x] = handle;
var worker = new MyWorker(handle, x);
ThreadPool.QueueUserWorkItem(new WaitCallback(MyWorker.printnum), worker);
}
WaitHandle.WaitAll(waitHandles);
Console.WriteLine("Press any key to finish");
Console.ReadKey();
}
class MyWorker
{
readonly ManualResetEvent handle;
readonly int number;
public MyWorker(ManualResetEvent handle, int number)
{
this.handle = handle;
this.number = number;
}
public static void printnum(object obj)
{
var worker = (MyWorker)obj;
Console.WriteLine("Call " + worker.number);
for (int i = 0; i < 10; i++) { Console.WriteLine(i); }
// we are done
worker.handle.Set();
}
}