首页 新闻 会员 周边

Task使用ContinueWith顺序执行的问题

0
悬赏园豆:20 [待解决问题]

各位大神,小弟代码如下
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的结果,求路过的大神指点一二,小弟感激不尽,谢谢!!!

侯小北的主页 侯小北 | 初学一级 | 园豆:39
提问于:2018-12-22 14:20

建议加上代码高亮,博问支持markdown代码高亮语法

dudu 5年前

@dudu: 好嘞,以后尽量学习学习,用的比较少,不足之处见谅,哈哈

侯小北 5年前
< >
分享
所有回答(2)
0

t.ContinueWith。表示执行完成后,在调用with里面的方法。如你代码可以理解为t有20个回调方法。执行顺序则是由scheduler唤醒,做不到顺序执行。
可以类似
var t;
for (var i=0...){
t=t.continuewith(....)
}

czd890 | 园豆:14412 (专家六级) | 2018-12-22 23:31

谢谢您,我已经解决啦

支持(0) 反对(0) 侯小北 | 园豆:39 (初学一级) | 2018-12-23 07:45

@侯小北: 解决啦就好,可以使用的方案补充进来,关闭问题,可以给在碰到类似问题的网友帮助

支持(0) 反对(0) czd890 | 园豆:14412 (专家六级) | 2019-01-05 22:13
0

去掉参数cts.Token和scheduler,设置TaskContinuationOptions的值为使用上一个任务的线程就行啦

侯小北 | 园豆:39 (初学一级) | 2018-12-23 07:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册