定一个不同的异步操作
static void Main(string[] args)
{
var task1 = new Task(new Action(TaskMethod));
task1.Start();
var task2 = new Task(delegate
{
TaskMethod();
});
task2.Start();
var task3 = new Task(() => TaskMethod());
task3.Start();
var task4 = Task.Factory.StartNew(() =>
{
TaskMethod();
});
Console.ReadLine();
}
private static void TaskMethod()
{
Console.WriteLine("Hello World");
}
上面有四种方式, 当然这只是语法糖的事, 效果都是一样的, 如果不用factory就的手动Start一个异步任务
取消任务操作任务
1,通知 System.Threading.CancellationToken,告知其应被取消。 var cancellationTokenSource = new CancellationTokenSource();
2,获取与此 System.Threading.CancellationTokenSource 关联的 System.Threading.CancellationToken var cancellationToken = cancellationTokenSource.Token;
var cancellationTokenSource = new CancellationTokenSource();
var cancellationToken = cancellationTokenSource.Token;
var task1 = new Task(new Action(TaskMethod), cancellationToken);
//启动 System.Threading.Tasks.Task,并将它安排到当前的 System.Threading.Tasks.TaskScheduler
task1.Start();
Console.WriteLine("一个异步操作已经执行");
cancellationTokenSource.Cancel();
var result = cancellationTokenSource.IsCancellationRequested
? "异步操作已经被取消"
: "异步操作还没有取消";
Console.WriteLine(result);
Console.ReadLine();
结果如下:
注意, 并不是task1.Start();就马上要执行里面的异步了,就上面代码来说而是你操作完之后才调用你异步操作的方法.
** 取消异步操作 **
var cancellationTokenSource = new CancellationTokenSource();
var cancellationToken = cancellationTokenSource.Token;
var task1 = new Task(() =>
{
for (var i = 0; i < int.MaxValue; i++)
{
if (cancellationTokenSource.IsCancellationRequested)
{
Console.WriteLine("异步操作已经被取消");
throw new OperationCanceledException(cancellationToken);
}
else
{
Console.WriteLine("int values {0}", i);
}
}
}, cancellationToken);
Console.WriteLine("按enter开始异步操作");
Console.ReadLine();
task1.Start();
Console.WriteLine("再次按enter键来取消任务");
Console.ReadLine();
cancellationTokenSource.Cancel();
Console.WriteLine("异步操作完成.");
Console.ReadLine();
通过cancellationTokenSource.IsCancellationRequested来监测是否已经取消了, 如果取消了就抛出 throw new OperationCanceledException(cancellationToken); 监测取消的方式有很多中, 不过感觉知道一种就够了 , 请原谅我偷懒, 最近事太多了
**休眠异步操作 **
var cancellationTokenSource = new CancellationTokenSource();
var cancellationToken = cancellationTokenSource.Token;
var task1 = new Task(() =>
{
for (var i = 0; i < int.MaxValue; i++)
{
var cancel = cancellationToken.WaitHandle.WaitOne(10000);
if (cancel)
{
throw new OperationCanceledException(cancellationToken);
}
}
}, cancellationToken);
task1.Start();
Console.WriteLine("再次按enter键来取消任务");
Console.ReadLine();
cancellationTokenSource.Cancel();
Console.WriteLine("异步操作完成.");
Console.ReadLine();
cancellationToken.WaitHandle.WaitOne(10000); 休眠10秒,或者还是原来的套路 Thread.Sleep(10000);
等待一个异步操作执行完再执行下一个异步
var task1 = new Task(new Action(TaskMethod));
task1.Start();
var task2 = new Task(delegate
{
TaskMethod();
});
task2.Start();
var task3 = new Task(() => TaskMethod());
task3.Start();
var task4 = Task.Factory.StartNew(() =>
{
TaskMethod();
});
Task.WaitAll(task1, task2, task3, task4);
https://msdn.microsoft.com/zh-cn/library/system.threading.tasks.task(v=vs.110).aspx 不说了撤退了 , 昨晚3点睡觉的