Frage

Aus Gründen der Argumentation, einen UI-Thread als Thread betrachtet, die einen Anruf hatten zu Application.Run() oder einem seiner Überlastungen es genannt und haben eine aktive Nachrichtenschleife läuft.

Gibt es eine Möglichkeit des Erfassens, wenn wir zur Zeit auf einem solchen Thread sind Ausführung?

Der Grund, warum ich das will, ist, weil ich eine Klasse mit einer eigenen Funktion, den Langlauf ist. Die Klasse selbst ist bereits multithreaded, und die Verwendung dieser Klasse ist, dass sie entweder von der Benutzeroberfläche verwendet werden könnten, oder von Hintergrund-Threads tun Verarbeitung. Diese Funktion fällt auch in diesem Netz. Aber ich will nicht, dass es den UI-Thread blockieren. Deshalb möchte ich feststellen, ob ich auf einem UI-Thread leite und wenn ja, gabeln den Funktionsaufruf in einem Hintergrundthread (wahrscheinlich ThreadPool, aber das ist kein Thema für diese Diskussion). Das ist ganz artig, aber die Hintergrund-Threads wahrscheinlich auf dem Ausgang der Funktion setzen, so blockiert ist für sie besser, während der UI-Thread wird in einer „Set-and-Forget“ Art und Weise erreichbar.

War es hilfreich?

Lösung

Ich würde vorschlagen, dass es die Art von Entscheidung ist sollte der Anrufer machen. Man könnte immer Wrapper-Methoden schreiben, um es einfacher zu machen - aber es bedeutet, dass Sie keine Probleme mit dem Anrufer zu sein in einer „odd“ Situation haben wird (zB ein UI-Framework Sie nicht wissen, über, oder etwas anderes mit einer Ereignisschleife ) und die falsche Entscheidung für sie zu machen.

Wenn die Methode immer Feedback in dem rechten Thread liefern muss, die ich in einem ISynchronizeInvoke (von Control implementiert) passieren würde, dass in eine UI-agnostischen Weise zu tun.

Andere Tipps

Wenn Sie Zugriff auf einen Form oder Control haben, können Sie überprüfen Sie die InvokeRequired Eigentum; dies wird wieder false, wenn Sie auf dem UI-Thread und true sind, wenn Sie nicht .. Wenn es in einem Kontext geschieht, wo man nicht gegen einen Control überprüfen, könnte man leicht eine statische Eigenschaft in Ihrem Programm, das Sie könnten überprüfen gegen einrichten. Speichern Sie eine Referenz beim Start Thread.CurrentThread und vergleichen Thread.CurrentThread zu dieser Referenz, wenn Sie wissen müssen:

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;
    }
}

Durch den Aufruf Program.IsRunningOnStartupThread Sie ein bool erhalten sagen, wenn Sie sind oder nicht.

bool isMessageLoopThread = System.Windows.Forms.Application.MessageLoop;

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top