using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyQuartz
{
class Program
{
static void Main(string[] args)
{
var asynctest = new MyClass();
//asynctest.Init();
asynctest.InitAsync();
}
}
/// <summary>
/// Demo of using for async and await
/// </summary>
public class MyClass
{
public void Init()
{
DisplayValue(); //这里会阻塞
Console.WriteLine("MyClass() End.");
Console.ReadLine();
}
public void InitAsync()
{
DisplayValueAsync(); //这里不会阻塞
Console.WriteLine("MyClass() End.");
Console.ReadLine();
}
private Task<double> GetValueAsync(double num1, double num2)
{
return Task.Run(() =>
{
for (int i = 0; i < 100000000; i++)
{
num1 = num1 / num2;
}
return num1;
});
}
private double GetValue(double num1, double num2)
{
for (int i = 0; i < 1000000000; i++)
{
num1 = num1 / num2;
}
return num1;
}
private async void DisplayValueAsync()
{
//此处会开新线程处理GetValueAsync任务,然后方法马上返回
double result = await GetValueAsync(1234.5, 1.01);
//这之后的所有代码都会被封装成委托,在GetValueAsync任务完成时调用
Console.WriteLine("Value is : " + result);
}
private void DisplayValue()
{
double result = GetValue(1234.5, 1.01);
Console.WriteLine("Value is : " + result);
}
}
}
DisplayValue()方法里await GetValueAsync()之后的所有代码都会在异步任务完成时才会执行。
DisplayValue()方法实际执行的代码如下:
public void DisplayValue()
{
System.Runtime.CompilerServices.TaskAwaiter<double> awaiter = GetValueAsync(1234.5, 1.01).GetAwaiter();
awaiter.OnCompleted(() =>
{
double result = awaiter.GetResult();
System.Diagnostics.Debug.WriteLine("Value is : " + result);
});
}
参考博客:
http://blog.csdn.net/tianmuxia/article/details/17675681
Async and callback
public static class TaskAsyncHelper
{
/// <summary>
/// 将一个方法function异步运行,在执行完毕时执行回调callback
/// </summary>
/// <param name="function">异步方法,该方法没有参数,返回类型必须是void</param>
/// <param name="callback">异步方法执行完毕时执行的回调方法,该方法没有参数,返回类型必须是void</param>
public static async void RunAsync(Action function, Action callback)
{
Func<Task> taskFunc = () =>
{
return Task.Run(() =>
{
function();
});
};
await taskFunc();
if (callback != null)
callback();
}
/// <summary>
/// 将一个方法function异步运行,在执行完毕时执行回调callback
/// </summary>
/// <typeparam name="TResult">异步方法的返回类型</typeparam>
/// <param name="function">异步方法,该方法没有参数,返回类型必须是TResult</param>
/// <param name="callback">异步方法执行完毕时执行的回调方法,该方法参数为TResult,返回类型必须是void</param>
public static async void RunAsync<TResult>(Func<TResult> function, Action<TResult> callback)
{
Func<Task<TResult>> taskFunc =() =>
{
return Task.Run(() =>
{
return function();
});
};
TResult rlt = await taskFunc();
if (callback != null)
callback(rlt);
}
}
public class TaskAsyncMethod
{
public static double ComputeMil()
{
double j = 1;
for (int i = 0; i < 1e7; i++)
j /= 1.01;
return j;
}
public static void printVal(double j)
{
Console.WriteLine(string.Format("finished, j={0}", j));
}
}
应用:
TaskAsyncHelper.RunAsync<double>(TaskAsyncMethod.ComputeMil, TaskAsyncMethod.printVal);
Console.WriteLine("This is an async method:\n " +
"Async calculation completion,\n" +
" next, exec callback to print the value. ");
Console.ReadLine();