Я бы предположил, что именно такое решение должен принять вызывающий. Вы всегда можете написать методы оболочки, чтобы упростить задачу, но это означает, что у вас не будет проблем с вызывающим абонентом, находящимся в «нечетной» ситуации (например, структура пользовательского интерфейса, о которой вы не знаете, или что-то еще с циклом событий ), и вы принимаете за них неправильное решение.
Если методу когда-либо понадобится обеспечить обратную связь в правильном потоке, я бы передал ISynchronizeInvoke
(реализовано Control
) чтобы сделать это без привязки к пользовательскому интерфейсу.
Если у вас есть доступ к форме
или Control
, вы можете проверить свойство InvokeRequired
; это вернет false
, если вы находитесь в потоке пользовательского интерфейса, и true
, если нет .. Если это произойдет в контексте, где вы не можете проверить с помощью Control
, вы можете легко настроить в своей программе статическое свойство, которое вы могли бы проверить. Сохраните ссылку на Thread.CurrentThread
при запуске и сравните Thread.CurrentThread
с этой ссылкой, когда вам нужно знать:
static class Program
{
private static Thread _startupThread = null;
[STAThread]
static void Main()
{
_startupThread = Thread.CurrentThread;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
public static bool IsRunningOnStartupThread()
{
return Thread.CurrentThread == _startupThread;
}
}
Вызов Program.IsRunningOnStartupThread
вы получите bool
, говорящее, есть вы или нет.
bool isMessageLoopThread = System.Windows.Forms.Application.MessageLoop;