各位大神,小弟代码如下
static void Main(string[] args)
{
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
CancellationTokenSource cts = new CancellationTokenSource();
Task t = new Task(() => { Console.WriteLine("开始"); }); t.Start();
for (int i = 0; i < 10; i++)
{
t.ContinueWith(x => { Console.WriteLine("11111"); }, cts.Token, TaskContinuationOptions.PreferFairness, scheduler);
}
for (int i = 0; i < 10; i++)
{
t.ContinueWith(x => { Console.WriteLine("2222222"); }, cts.Token, TaskContinuationOptions.PreferFairness, scheduler);
}
Console.WriteLine("这个线程结束");
Console.ReadLine();
}
我想全输出111111之后再全部输出2222222(也就是说顺序执行),但是每次都会在输出222222里面有111111的结果,求路过的大神指点一二,小弟感激不尽,谢谢!!!
t.ContinueWith。表示执行完成后,在调用with里面的方法。如你代码可以理解为t有20个回调方法。执行顺序则是由scheduler唤醒,做不到顺序执行。
可以类似
var t;
for (var i=0...){
t=t.continuewith(....)
}
谢谢您,我已经解决啦
@侯小北: 解决啦就好,可以使用的方案补充进来,关闭问题,可以给在碰到类似问题的网友帮助
去掉参数cts.Token和scheduler,设置TaskContinuationOptions的值为使用上一个任务的线程就行啦
建议加上代码高亮,博问支持markdown代码高亮语法
– dudu 5年前@dudu: 好嘞,以后尽量学习学习,用的比较少,不足之处见谅,哈哈
– 侯小北 5年前