C# Thead扩展封装

场景一: 使用Thread创建两个线程A 和B,如何顺序执行这两个线程,即确保执行完A再执行B?
解决方案:代码就不写了比较简单,思路:再启动一个线程,在这个线程里按顺序start A和B,即能保证先执行A再执行B、

场景二:使用Thread开辟新的线程执行任务,如何获取返回结果?
思路:定义Func委托,在线程里执行此委托,即可获取返回值

方式一:启动线程后,直接阻塞线程,取得返回值,这种操作会阻塞主线程,造成界面卡顿,不推荐使用。

Func<int> func = () =>
{
    Thread.Sleep(2000);
    return DateTime.Now.Day;
};

int result = ThreadWithReturnValue1(func);
Console.WriteLine(result);

static T ThreadWithReturnValue1<T>(Func<T> func)
{
    T t = default;
    //ThreadStart threadStart = new ThreadStart(() =>
    //{
    //    t = func.Invoke();
    //});
    //Thread thread = new Thread(threadStart);

    Thread thread = new Thread(() =>
    {
        t = func.Invoke();
    });

    thread.Start();
    thread.Join();//可以获取返结果,但是这样会阻塞界面
    return t;
}

方式二:线程启动后,不直接阻塞线程,而是返回一个委托,当需要得到执行结果的时候在触发委托(此时线程已经运行一段时间,有可能已经结束也有可能在进行中,减少界面卡顿的现象)

Func<int> funcResult = ThreadWithReturnValue2(func);
Console.WriteLine("dosomething");
Console.WriteLine("dosomething");
Console.WriteLine("dosomething");
Console.WriteLine("dosomething");
int iResult = funcResult.Invoke();//如果需要得到执行结果,是必须要等待的

static Func<T> ThreadWithReturnValue2<T>(Func<T> func)
{
    T t = default;
    //ThreadStart threadStart = new ThreadStart(() =>
    //{
    //    t = func.Invoke();
    //});
    //Thread thread = new Thread(threadStart);

    Thread thread = new Thread(() =>
    {
        t = func.Invoke();
    });
    thread.Start();

    return new Func<T>(() =>
    {
        thread.Join();
        return t;
    });
}

猜你喜欢

转载自blog.csdn.net/weixin_40719943/article/details/106972946