// IDE-Voreinstellungen: // Option Explicit On // Option Strict On // "My Project"-Einstellungen: // Imports Microsoft.VisualBasic.ControlChars // Imports System.Windows.Forms // Imports System using System; using global::System.Windows.Forms; namespace Pilz.Threading { /// /// Stellt Methoden bereit, mit denen ein beliebiger Methoden-Aufruf mit bis zu 3 Argumenten /// in einen Nebenthread verlegt werden kann, bzw. aus einem Nebenthread in den Hauptthread /// public class CrossThreadsInvokeing { public static void RunAsync(Action Action, T1 Arg1, T2 Arg2, T3 Arg3) { Action.BeginInvoke(Arg1, Arg2, Arg3, Action.EndInvoke, null); } public static void RunAsync(Action Action, T1 Arg1, T2 Arg2) { Action.BeginInvoke(Arg1, Arg2, Action.EndInvoke, null); } public static void RunAsync(Action Action, T1 Arg1) { Action.BeginInvoke(Arg1, Action.EndInvoke, null); } public static void RunAsync(Action Action) { Action.BeginInvoke(Action.EndInvoke, null); } private static bool GuiCrossInvoke(Delegate Action, params object[] Args) { var frms = Application.OpenForms; if (frms.Count > 0 && frms[0].InvokeRequired) { frms[0].BeginInvoke(Action, Args); return true; } return false; } public static void RunGui(Action Action, T1 Arg1, T2 Arg2, T3 Arg3) { if (!GuiCrossInvoke(Action, Arg1, Arg2, Arg3)) Action(Arg1, Arg2, Arg3); } public static void RunGui(Action Action, T1 Arg1, T2 Arg2) { if (!GuiCrossInvoke(Action, Arg1, Arg2)) Action(Arg1, Arg2); } public static void RunGui(Action Action, T1 Arg1) { if (!GuiCrossInvoke(Action, (object)Arg1)) Action(Arg1); } public static void RunGui(Action Action) { if (!GuiCrossInvoke(Action)) Action(); } } }