Почему эти два блока кода C# в Task ведут себя по-разному?C#

Место общения программистов C#
Ответить
Anonymous
 Почему эти два блока кода C# в Task ведут себя по-разному?

Сообщение Anonymous »

Я изучаю C# Task, async/await и столкнулся с ситуацией, которую не совсем понимаю. Я сделал два фрагмента кода: первый основан на консольном приложении, а второй — на wpf. Вот два фрагмента кода:
  • код для консольного приложения:

Код: Выделить всё

async static Task Main()
{
Helper.PrintThreadId("Before");
await FooAsync();
Helper.PrintThreadId("After");
}

async static Task FooAsync()
{
Helper.PrintThreadId("Before");
await Task.Delay(1000);
Helper.PrintThreadId("After");
}

class Helper
{
private static int index = 1;
public static void PrintThreadId(string message = null, [CallerMemberName] string name = null)
{
var title = $"{index}: {name}";
if (!string.IsNullOrEmpty(message))
title += $" @ {message}";
Console.WriteLine("Thread ID: " + Environment.CurrentManagedThreadId + ", title: " + title);
Interlocked.Increment(ref index);
}
}
  • код для wpf (помощник точно такой же, как и в консольном приложении):

Код: Выделить всё

async Task HeavyJob()
{
Helper.PrintThreadId("Before");
await Task.Delay(3000);
Helper.PrintThreadId("After");
return 10;
}

private async void Button_Click(object sender, RoutedEventArgs e)
{
Helper.PrintThreadId("Before");
var res = await HeavyJob().ConfigureAwait(false);
Helper.PrintThreadId("After");
}

class Helper
{
private static int index = 1;
public static void PrintThreadId(string message = null, [CallerMemberName] string name = null)
{
var title = $"{index}: {name}";
if (!string.IsNullOrEmpty(message))
title += $" @ {message}";
Debug.WriteLine("Thread ID: " + Environment.CurrentManagedThreadId + ", title: " + title);
Interlocked.Increment(ref index);
}
}
Тогда для консольного приложения результат будет следующим:
[img]https:/ /i.sstatic.net/O4Of3M18.png[/img]

для wpf результат:
Изображение

Мой вопрос — третья строка из двух результатов. почему эти двое ведут себя по-разному? Насколько я понимаю, идентификатор потока в третьей и четвертой строке должен быть одинаковым.
Надеюсь, кто-нибудь сможет объяснить этот вопрос. Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/792 ... ifferently
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»