我最近阅读了这篇博客文章:ContinueWith is Dangerous, Too,其中指出:
不幸的是,我看到开发人员在 Task.ContinueWith。 StartNew的主要问题之一是它具有 令人困惑的默认调度程序。这个完全相同的问题也存在于 ContinueWith API。就像StartNew一样,ContinueWith将默认为 TaskScheduler.Current,而不是TaskScheduler.Default。
我认为我有一个有效的用例,可以使用ContinueWith
而不是使用await:
tasks.Add(database.Table<Table1>().ToListAsync().ContinueWith(sender =>
{
//some algorithm here
});
tasks.Add(database.Table<Table2>().ToListAsync().ContinueWith(sender =>
{
//some algorithm here
});
await Task.WhenAll(tasks).ConfigureAwait(false);
现在从以上博客文章中,我认为正确的使用方法是:
tasks.Add(database.Table<Table1>().ToListAsync().ContinueWith(sender =>
{
//some algorithm here
}, TaskScheduler.Default);
tasks.Add(database.Table<Table2>().ToListAsync().ContinueWith(sender =>
{
//some algorithm here
}, TaskScheduler.Default);
await Task.WhenAll(tasks).ConfigureAwait(false);
这正确吗?
上面的代码是否意味着ContinueWith
现在将在ThreadPool线程上运行?
TaskScheduler.Current,TaskScheduler.Default 和 TaskScheduler.FromCurrentSynchronisationContext()
有什么区别?