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

本文关键字:执行 代码 线程 | 更新日期: 2023-09-27 18:04:55

有哪些方法可以在指定线程上执行某些代码?假设我有一个head和一个委托我需要在这个线程上执行这个委托。我该如何实现它?

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

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

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

在委托的情况下-标准的生产者/消费者队列应该工作良好(只要它是线程安全的)。我用一个基于这个答案的

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

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上,直到你将一个动作排队,然后执行它并等待下一个动作。

你应该能够使用Dispatcher,至少如果你是在。net 4。