一、简介
在使用线程代码时,因为用到委托的方式,所以写起来不是特别方便,为了简化异步操作的执行,我特意做了一个简单的封装。
二、功能实现
新建一个 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