Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.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# - Fatal编程技术网

如何在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();
        }
    }