В то время как есть возможность «выйти» из другого потока в поток пользовательского интерфейса, используя Dispatcher
или SynchronizationContext
, я настоятельно рекомендую этого не делать. Это потому, что это делает вашу логику менее тестируемой и более привязанной к ее среде. В случае Dispatcher
он сильно привязан к работе в среде WPF; SynchronizationContext
лучше, но он все еще привязан к работе в какой-то среде.
При таком подходе у вас есть зависимость от вашей логики до потока пользовательского интерфейса, например:
Код пользовательского интерфейса => фоновая логика потока => Поток пользовательского интерфейса
Вместо этого используйте IProgress<T>
и Progress<T>
из фоновой логики потока, чтобы сообщать отчеты о ходе выполнения своему вызывающему, который решает, как отображать эти отчеты о ходе выполнения. Тогда ваша зависимость выглядит следующим образом:
UI code => логика фонового потока
и ваша логика фонового потока не зависит от наличия потока UI. Это делает его более убедительным и более тестируемым.
Все, в чем Вы нуждаетесь, находится в Системе. Диагностика, например: проверять, отвечает ли процесс.
using System;
using System.Diagnostics;
namespace ProcessStatus
{
class Program
{
static void Main(string[] args)
{
Process[] processes = Process.GetProcesses();
foreach (Process process in processes)
{
Console.WriteLine("Process Name: {0}, Responding: {1}", process.ProcessName, process.Responding);
}
Console.Write("press enter");
Console.ReadLine();
}
}
}
См. "не отвечающий" сообщение в Windows Form Applicati в программном обеспечении ручья вуали