Как запустить метод делегата в главном потоке, который был вызван в отдельном потоке? - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу sh запустить onSomeEvent() в главном потоке, потому что я планирую получить доступ к Clipboard, что можно сделать только в основном потоке. Если возможно, я sh буду делать это как консольное приложение. Я знаю, что мог бы сделать WPF и обернуть вызовы в Control.Invoke(), но я предпочитаю не использовать всю инфраструктуру просто для перемещения вызова метода между двумя потоками. Я сделал упрощенный пример ниже:

   public static class Listener {
      public static event Action onSomeEvent;
      public static void Run() {
         onSomeEvent?.Invoke();
      }
   }

   public class Program {

      public static void Main(string[] args) {
         Console.WriteLine("Main thread id: " + Thread.CurrentThread.ManagedThreadId);
         Listener.onSomeEvent += () => {
            Console.WriteLine("onSomeEvent's ManagedThreadId: " + Thread.CurrentThread.ManagedThreadId);
         };

         Thread spawn = new Thread(() => {
            Console.WriteLine("spawned thread's ManagedThreadId: " + Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(1000);
            Listener.Run();

         });
         spawn.Start();

         Console.ReadLine();
      }
   }

1 Ответ

0 голосов
/ 16 апреля 2020

Вы можете отправить свой главный поток в блокирующее чтение l oop в очереди задач. Как это:

class Program
{
    public static BlockingCollection<Task> MainThreadTasks = new BlockingCollection<Task>();
    static void Main(string[] args)
    {
        Console.WriteLine($"Running on Main thread {Thread.CurrentThread.ManagedThreadId}");

        ThreadPool.QueueUserWorkItem((o) =>
            {
                var t = new Task(() => Console.WriteLine("Do Sometihg"));
                MainThreadTasks.Add(t);
                t.Wait();
            }
        );


        while (true)
        {
            Console.WriteLine("Main thread waiting Task");
            var task = MainThreadTasks.Take();

            Console.WriteLine("Main thread running Task");
            task.RunSynchronously();
            Console.WriteLine("Main thread finished Task");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...