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

C# 唤醒像线程一样无限休眠的任务。中断

C# 唤醒像线程一样无限休眠的任务。中断,c#,.net,multithreading,task-parallel-library,C#,.net,Multithreading,Task Parallel Library,我有几个始终运行的线程正在执行“任务”,还有一个线程获得新的“任务”,并在这些线程之间分配 执行任务的线程: public class TaskExecutor { public object CurrentTask { get; set; } public Thread ThreadRef { get; set; } private void Run() { while (true) { try

我有几个始终运行的线程正在执行“任务”,还有一个线程获得新的“任务”,并在这些线程之间分配

执行任务的线程:

public class TaskExecutor
{
    public object CurrentTask { get; set; }
    public Thread ThreadRef { get; set; }

    private void Run()
    {
        while (true)
        {
            try
            {
                if (CurrentTask != null)
                    ExecuteTask(CurrentTask);
                else
                    Thread.Sleep(Timeout.Infinite);
            }
            catch (ThreadInterruptedException)
            {

            }
            catch (Exception)
            {
                CurrentTask = null;
            }
        }
    }

    private void ExecuteTask(object task)
    {

    }
}
分配任务的线程:

private void TryDistribute(TaskExecutor thread, object task)
{
    if (thread.CurrentTask == null)
    {
        thread.CurrentTask = task;
        thread.ThreadRef.Interrupt();
    }
}

如何使用TPL任务实现相同的逻辑(无限期等待和唤醒以供其他线程处理?

请参阅-问题不同,但公认的答案是适用的。我不明白为什么要在
TryDistribute
中调用
中断
(或者根本不)。您不能用等待句柄包装器(如
ManualResetEvent
)来表达您想要的行为吗?。你所做的使我想起了我的老朋友。如果您需要旧.NET中的任务,可以使用my libraries()。在没有TPL的情况下实现该行为是一种非常有问题的方法。无论是否使用TPL,都应该使用正确的同步机制。@Servy,这就是我想要的-将此逻辑移到TPL。但正如其他评论者所指出的,最好使用ManualResetEvent而不是无限睡眠
我有几个始终运行的线程正在执行“任务”,还有一个线程获得新的“任务”,并在这些线程之间分配。
。。。喜欢线程池?为什么不直接使用线程池呢?