Я прочитал этот вопрос от Noseratio, который показывает поведение, когда TaskScheduler.Current не то же самое после того, как ожидаемый завершил свою работу.
В ответе указывается, что:
Если фактическая задача не выполняется, то
TaskScheduler.Currentсовпадает сTaskScheduler.Default
Это правда. Я уже видел это здесь:
TaskScheduler.Default
- Возвращает экземпляр
ThreadPoolTaskSchedulerTaskScheduler.Current
- Если вызываемый из исполняющей задачи возвращает
TaskSchedulerвыполняемой в настоящее время задачи- Если вызов из любого другого места вернет
TaskScheduler.Default
Но потом я подумал: если да, то создайте фактический Task (а не только Task.Yield()) и протестируйте его:
async void button1_Click_1(object sender, EventArgs e)
{
var ts = TaskScheduler.FromCurrentSynchronizationContext();
await Task.Factory.StartNew(async () =>
{
MessageBox.Show((TaskScheduler.Current == ts).ToString()); //True
await new WebClient().DownloadStringTaskAsync("http://www.google.com");
MessageBox.Show((TaskScheduler.Current == ts).ToString());//False
}, CancellationToken.None, TaskCreationOptions.None,ts).Unwrap();
}
Первый Messagebox - "True", второй - "False"
Вопрос:
Как вы можете видеть, я создал фактическую задачу.
Я могу понять, почему первый MessageBox дает True. Это из-за:
Если вызов из задачи выполнения возвратит TaskScheduler выполняемой в настоящее время задачи
И у этой задачи есть ts, который является отправленным TaskScheduler.FromCurrentSynchronizationContext()
Но почему контекст не сохраняется во втором MessageBox? Для меня это было непонятно из ответа Стефана.
Дополнительная информация:
Если я напишу вместо этого (второго сообщения):
MessageBox.Show((TaskScheduler.Current == TaskScheduler.Default).ToString());
Это дает True. Но почему?