Я прочитал этот вопрос от Noseratio, который показывает поведение, когда TaskScheduler.Current
не то же самое после того, как ожидаемый завершил свою работу.
В ответе указывается, что:
Если фактическая задача не выполняется, то
TaskScheduler.Current
совпадает сTaskScheduler.Default
Это правда. Я уже видел это здесь:
TaskScheduler.Default
- Возвращает экземпляр
ThreadPoolTaskScheduler
TaskScheduler.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
. Но почему?