C# - Task

初识

异步除了用委托delegateBegin/EndInvoke外,还可以用Task

//直接实例化:手动Start
var task1 = new Task(() => { ... });
task1.Start();
//工厂创建:直接执行
var task2 = Task.Factory.StartNew(() => { ... });

特点:任务控制,按序执行
注意:Task.Run().Start()报错,不能对已开始的任务调用Start。

问题总结

场景:预加载
页面加载或实现其他功能时,提前执行耗时操作,避免卡顿:参考

private Task<string> _getBigDataTask;
private void EarlierWork() {
    _getBigDataTask = CreateGetDataTask();//提前执行耗时操作    
}
private async Task<string> CreateGetDataTask() {
    return await Task.Run(() => {
        // 耗时操作
        return "Data";
    }).ConfigureAwait(false); 
}
private void DoSomething() {
    //init
    //获取之前提前执行的结果,若执行未结束,则异步等待执行完成,获取结果后再执行
    string data = _getStringDataTask.Result;
    //after work 
}

注意必须ConfigureAwait(false),否则死锁,详见:高铁直达
BeginInvoke异步封装方法

public static void AsyncInvoke<T1, T2>(RvcFunc<T1> RvcFunc, T1 param, Action<T2> callBack)
	where T1 : ReqParamBase, new()
	where T2 : RetParamBase, new()
{
	RvcFunc.BeginInvoke(param, (ret) => {
			try {
				T2 RvcFuncResult = (T2)RvcFunc.EndInvoke(ret);
				callBack(RvcFuncResult);
			} catch { /*noting to process*/ }
		}, null);
}
//调用方式
InvokeHelper.AsyncInvoke<XxxReq, XxxRet>(
	new RvcFunc<XxxReq>(XxxClass.XxxFunction), inParamReq, (ret) => { });
posted @ 2020-03-04 20:36  万箭穿心,习惯就好。  阅读(613)  评论(0编辑  收藏  举报