C# 使用线程调用方法的便捷方式

一、简介

在使用线程代码时,因为用到委托的方式,所以写起来不是特别方便,为了简化异步操作的执行,我特意做了一个简单的封装。

二、功能实现

新建一个 Winform 项目,新建一个类 AsyncRunner.cs,主要作用是以异步方式运行 Action 和 Func 委托来简化异步操作的执行,支持从无参数到最多四个参数的不同重载版本,如果需要更多的参数重载可以自己加一下。

using System;
using System.Threading.Tasks;

public class AsyncRunner
{
    /// <summary>
    /// 使用线程去调用一个无参数的方法
    /// </summary>
    /// <param name="action"></param>
    public static void RunAsync(Action action)
    {
        Task.Run(action);
    }
    /// <summary>
    /// 使用线程去调用一个无参数,但有返回值的方法
    /// </summary>
    /// <typeparam name="TResult"></typeparam>
    /// <param name="func"></param>
    /// <returns></returns>
    public static Task<TResult> RunAsync<TResult>(Func<TResult> func)
    {
        return Task.Run(func);
    }
    /// <summary>
    /// 使用线程去调用参数只有1个,并无返回值的方法
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="action"></param>
    /// <param name="param"></param>
    public static void RunAsync<T>(Action<T> action, T param)
    {
        Task.Run(() => action(param));
    }
    /// <summary>
    /// 使用线程去调用参数只有1个,并有返回值的方法
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <typeparam name="TResult"></typeparam>
    /// <param name="func"></param>
    /// <param name="param"></param>
    /// <returns></returns>
    public static Task<TResult> RunAsync<T, TResult>(Func<T, TResult> func, T param)
    {
        return Task.Run(() => func(param));
    }
    /// <summary>
    /// 使用线程去调用参数只有2个,并无返回值的方法
    /// </summary>
    /// <typeparam name="T1"></typeparam>
    /// <typeparam name="T2"></typeparam>
    /// <param name="action"></param>
    /// <param name="param1"></param>
    /// <param name="param2"></param>
    public static void RunAsync<T1, T2>(Action<T1, T2> action, T1 param1, T2 param2)
    {
        Task.Run(() => action(param1, param2));
    }
    /// <summary>
    /// 使用线程去调用参数只有2个,并有返回值的方法
    /// </summary>
    /// <typeparam name="T1"></typeparam>
    /// <typeparam name="T2"></typeparam>
    /// <typeparam name="TResult"></typeparam>
    /// <param name="func"></param>
    /// <param name="param1"></param>
    /// <param name="param2"></param>
    /// <returns></returns>
    public static Task<TResult> RunAsync<T1, T2, TResult>(Func<T1, T2, TResult> func, T1 param1, T2 param2)
    {
        return Task.Run(() => func(param1, param2));
    }
    /// <summary>
    /// 使用线程去调用参数只有3个,并无返回值的方法
    /// </summary>
    /// <typeparam name="T1"></typeparam>
    /// <typeparam name="T2"></typeparam>
    /// <typeparam name="T3"></typeparam>
    /// <param name="action"></param>
    /// <param name="param1"></param>
    /// <param name="param2"></param>
    /// <param name="param3"></param>
    public static void RunAsync<T1, T2, T3>(Action<T1, T2, T3> action, T1 param1, T2 param2, T3 param3)
    {
        Task.Run(() => action(param1, param2, param3));
    }
    /// <summary>
    /// 使用线程去调用参数只有3个,并有返回值的方法
    /// </summary>
    /// <typeparam name="T1"></typeparam>
    /// <typeparam name="T2"></typeparam>
    /// <typeparam name="T3"></typeparam>
    /// <typeparam name="TResult"></typeparam>
    /// <param name="func"></param>
    /// <param name="param1"></param>
    /// <param name="param2"></param>
    /// <param name="param3"></param>
    /// <returns></returns>
    public static Task<TResult> RunAsync<T1, T2, T3, TResult>(Func<T1, T2, T3, TResult> func, T1 param1, T2 param2, T3 param3)
    {
        return Task.Run(() => func(param1, param2, param3));
    }
    /// <summary>
    /// 使用线程去调用参数只有4个,并无返回值的方法
    /// </summary>
    /// <typeparam name="T1"></typeparam>
    /// <typeparam name="T2"></typeparam>
    /// <typeparam name="T3"></typeparam>
    /// <typeparam name="T4"></typeparam>
    /// <param name="action"></param>
    /// <param name="param1"></param>
    /// <param name="param2"></param>
    /// <param name="param3"></param>
    /// <param name="param4"></param>
    public static void RunAsync<T1, T2, T3, T4>(Action<T1, T2, T3, T4> action, T1 param1, T2 param2, T3 param3, T4 param4)
    {
        Task.Run(() => action(param1, param2, param3, param4));
    }
    /// <summary>
    /// 使用线程去调用参数只有4个,并有返回值的方法
    /// </summary>
    /// <typeparam name="T1"></typeparam>
    /// <typeparam name="T2"></typeparam>
    /// <typeparam name="T3"></typeparam>
    /// <typeparam name="T4"></typeparam>
    /// <typeparam name="TResult"></typeparam>
    /// <param name="func"></param>
    /// <param name="param1"></param>
    /// <param name="param2"></param>
    /// <param name="param3"></param>
    /// <param name="param4"></param>
    /// <returns></returns>
    public static Task<TResult> RunAsync<T1, T2, T3, T4, TResult>(Func<T1, T2, T3, T4, TResult> func, T1 param1, T2 param2, T3 param3, T4 param4)
    {
        return Task.Run(() => func(param1, param2, param3, param4));
    }

    private AsyncRunner() { }
}

稍微讲解下方法中的泛型,T1,T2 都是传值方法的类型,param1,param2 则是泛型的具体值

public static Task<TResult> RunAsync<T1, T2, TResult>(Func<T1, T2, TResult> func, T1 param1, T2 param2)
{
    return Task.Run(() => func(param1, param2));
}

TResult 不是一个特定的类或类型,而是一个泛型类型参数的占位符。TResult 通常出现在泛型方法或者委托中,表示该方法或委托返回的类型。

例:

public TResult GetDefaultValue<TResult>()
{
    return default(TResult);
}

调用:

int defaultInt = GetDefaultValue<int>(); // 返回 0

string defaultString = GetDefaultValue<string>(); // 返回 null

添加一个类 Test.cs,用来测试  AsyncRunner 类中的方法效果

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

internal class Test
{
    public void test1()
    {
        Console.WriteLine("test1");
    }

    public int test2()
    {
        return 1;
    }

    public void test3(int x)
    {
        Console.WriteLine("x:{0}", x);
    }

    public int test4(int x)
    {
        return x;
    }

    public void test5(int x, int y)
    {
        int result = x + y;
        Console.WriteLine("相加:{0}", result);
    }

    public (bool, int) test6(int x, int y)
    {
        int result = x + y;
        return (true, result);
    }
}

三、测试

Winform 界面如下:

这里,我只演示2个参数的重载方法,多个参数的用法基本差不多。

Form1 代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 多线程封装
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Test test = new Test();

        //调用一个无参数的方法
        private void button1_Click(object sender, EventArgs e)
        {
            AsyncRunner.RunAsync(test.test1);
        }

        //调用一个无参数,但有返回值的方法
        private async void button2_Click(object sender, EventArgs e)
        {
            int result = await AsyncRunner.RunAsync(test.test2);
            Console.WriteLine("结果:{0}", result);
        }

        //调用参数只有1个,并无返回值的方法
        private void button3_Click(object sender, EventArgs e)
        {
            AsyncRunner.RunAsync(test.test3, 2);
        }

        //调用参数只有1个,并有返回值的方法
        private async void button4_Click(object sender, EventArgs e)
        {
            int result = await AsyncRunner.RunAsync(test.test4, 2);
            Console.WriteLine("结果:{0}", result);
        }

        //调用参数只有2个,并无返回值的方法
        private void button5_Click(object sender, EventArgs e)
        {
            AsyncRunner.RunAsync(test.test5, 2, 3);
        }

        //调用参数只有2个,并有返回值的方法
        private async void button6_Click(object sender, EventArgs e)
        {
            var (isError, result) = await AsyncRunner.RunAsync(test.test6, 5, 3);
            Console.WriteLine("是否错误:{0},结果:{1}", isError, result);
        }
    }
}

运行:

源码是免费的哦

https://download.csdn.net/download/qq_38693757/89627229

结束

如果这个帖子对你有所帮助,欢迎 关注 + 点赞 + 留言

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊思宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值