季明月
2021-08-20 23:14
采纳率: 100%
浏览 41

C# 线程问题 如何在子线程中调用方法,使这个方法为主线程执行的

如下,如何在task1这个线程中,通过委托给主线程来调用ThreadToMain这个方法
使输出为(顺序不重要):
执行主线程!1
hello, task2的线程ID为4
hello, task1的线程ID为3
调用这个程序的线程ID为1


using System;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        public delegate void DelegateFun();

        static void Main(string[] args)
        {
            DelegateFun c = new DelegateFun(ThreadToMain);

            void ThreadToMain()
            {
                Console.Write("ThreadToMain");
                Console.WriteLine($"的线程ID为{Thread.CurrentThread.ManagedThreadId}");
            }
            //1.new方式实例化一个Task,需要通过Start方法启动
            Task task1 = new Task(() =>
            {
                Thread.Sleep(100);
                Console.WriteLine($"hello, task1的线程ID为{Thread.CurrentThread.ManagedThreadId}");
                c.Invoke();
            });
            task1.Start();

            //2.Task.Factory.StartNew(Action action)创建和启动一个Task
            Task task2 = Task.Factory.StartNew(() =>
            {
                Thread.Sleep(100);
                Console.WriteLine($"hello, task2的线程ID为{ Thread.CurrentThread.ManagedThreadId}");
            });

            Console.Write("执行主线程!");
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
 
            Console.ReadKey();
        }
    }
}

img

  • 收藏

1条回答 默认 最新

  • CSDN专家-showbo 2021-08-21 13:51
    已采纳

    控制台程序没搞,winform/wf可以用this.invoke切换到UI线程,控制台程序没有this无invoket方法。要实现需要做大量的改动,一下内容来自Stack Overflow

    https://stackoverflow.com/questions/12285180/continue-task-on-main-thread
    
    You can't do this (without a lot of work) in a Console application. The mechanisms built into the TPL for marshaling the call back onto a thread all rely on the thread having an installed SynchronizationContext. This typically gets installed by the user interface framework (ie: Application.Run in Windows Forms, or in WPF's startup code, etc).
    

    可以使用wait等待task1执行完毕后再执行ThreadToMain方法,有帮助或启发麻烦点个采纳【本回答右上角】,谢谢~~

    using System;
    using System.Threading;
    using System.Threading.Tasks;
    namespace ConsoleApp1
    {
        class Program
        {
            public delegate void DelegateFun();
            static void Main(string[] args)
            {
                DelegateFun c = new DelegateFun(ThreadToMain);
                void ThreadToMain()
                {
                    Console.Write("ThreadToMain");
                    Console.WriteLine($"的线程ID为{Thread.CurrentThread.ManagedThreadId}");
                }
                //1.new方式实例化一个Task,需要通过Start方法启动
                Task task1 = new Task(() =>
                {
                    Thread.Sleep(100);
                    Console.WriteLine($"hello, task1的线程ID为{Thread.CurrentThread.ManagedThreadId}");
                    //c.Invoke();
                });
                task1.Start();
                task1.Wait();//////////////
    
                c.Invoke();//////////放在这里执行
                //2.Task.Factory.StartNew(Action action)创建和启动一个Task
                Task task2 = Task.Factory.StartNew(() =>
                {
                    Thread.Sleep(100);
                    Console.WriteLine($"hello, task2的线程ID为{ Thread.CurrentThread.ManagedThreadId}");
                });
                Console.Write("执行主线程!");
                Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
                Console.ReadKey();
            }
        }
    }
    
    
    
    打赏 评论

相关推荐 更多相似问题