Я Мессинг с С # Await/асинхронной, когда я написал следующую программу:Можно ли изменить свойства ui после ожидания в асинхронных методах?
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
Test();
while (true) { }
}
static async void Test()
{
var t = Task.Run(()=> Thread.Sleep(1000));
await t;
throw new Exception("This exception happens in a worker thread");
}
}
Когда я запускаю эту программу, я могу ясно видеть в окне потока Visual Studio, что происходит исключение в Worker Thread
, а не Main Thread
, это заставляет меня поверить, что когда я жду задания, мой метод может быть закончен другим потоком.
Однако, когда я открываю новые окна формы приложения и добавьте следующий обработчик события:
async void button1_Click(object sender, EventArgs e)
{
var task = Task.Run(() => Thread.Sleep(1000));
await task;
button1.Text = "I'm in the main thread!"; //this works
}
Это работает, так что я замечаю, что в консольном приложении моя функция Test возобновляется рабочим потоком, в то время как в приложении Windows Forms он всегда возобновляется основным потоком.
Почему это? Это надежный?
Когда вы ожидаете задачи, любое исключение, вызванное задачей, повторно создается в контексте, в котором оживает ожидание (т. Е. Поток пользовательского интерфейса в случае оконной программы). Это надёжно. –
Да, я тоже что-то читал, но в консольном приложении, если я установил точку останова в новом приложении Exception и просмотрю окно потоков, я вижу рабочий поток как текущий поток –