如何在指定的线程上执行代码

时间:2011-08-08 19:09:59

标签: c# .net

在指定的线程上执行某些代码有哪些方法?所以让我们假设我有一个Thead和一个委托,我需要在这个线程上执行这个委托。我该如何实施呢?

我对SynchronizationContext等基础设施不感兴趣,我想知道手动实现这种行为的方法。

4 个答案:

答案 0 :(得分:13)

要在指定的线程上执行某些操作,您需要该线程来提取工作,例如从同步队列中提取工作。这可以是委托或具有某种Execute()方法的已知类型。在UI框架的情况下,通常还可以直接(或间接)将工作添加到主线程(通过消息队列) - 例如,Control.InvokeDispatcher.Invoke

对于委托 - 标准的生产者/消费者队列应该可以正常工作(只要它是线程安全的)。我使用的基于this answer

答案 1 :(得分:8)

如果您只是想要将同一个线程用于多个操作,则可以使用阻塞集合中的线程。简短演示:

class Program
{
    static void Main(string[] args)
    {
        var c = new System.Collections.Concurrent.BlockingCollection<Tuple<bool, Action>>();
        var t = new Thread(() =>
        {
            while (true)
            {
                var item = c.Take();
                if (!item.Item1) break;
                item.Item2();
            }
            Console.WriteLine("Exiting thread");
        });
        t.Start();

        Console.WriteLine("Press any key to queue first action");
        Console.ReadKey();
        c.Add(Tuple.Create<bool, Action>(true, () => Console.WriteLine("Executing first action")));

        Console.WriteLine("Press any key to queue second action");
        Console.ReadKey();
        c.Add(Tuple.Create<bool, Action>(true, () => Console.WriteLine("Executing second action")));

        Console.WriteLine("Press any key to stop the thread");
        Console.ReadKey();
        c.Add(Tuple.Create<bool, Action>(false, null));

        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }
}

该线程将阻止Take直到你排队一个动作,然后执行它并等待下一个动作。

答案 2 :(得分:1)

至少如果你使用的是.NET 4,你应该可以使用Dispatcher

答案 3 :(得分:-1)

最大的问题是为什么你会想要那个。

有问题的线程必须合作,轮询队列或其他东西。这几乎是不值得的,所以几乎没有它的支持。

异常当然是GUI线程。在这种情况下,请通过Control.Invoke或Dispatcher.Invoke使用SyncContext。