Laden...

ThreadPool Snippet

Erstellt von ProGamer vor 11 Jahren Letzter Beitrag vor 11 Jahren 3.725 Views
P
ProGamer Themenstarter:in
660 Beiträge seit 2008
vor 11 Jahren
ThreadPool Snippet

Beschreibung:

Hallo zusammen!

Dieses Snippet dient dazu den Umgang mit Threading etwas zu vereinfachen.
Ich selbst habe in einigen Projekten immer wieder mal Methoden in einem Thread
ausführen müssen (Datenbank abfragen ist ein gutes beispiel) und danach kam die
Synchronisation mit dem GUI-Thread noch hinzu.

Bitte das ExceptionHandling nicht vergessen!


public class csThreading
    {
        private static Dispatcher _disObject = Dispatcher.CurrentDispatcher;
        public static Dispatcher disObject
        {
            get { return _disObject; }
        }

        public static void QueueUserWorkItem( Action ThreadMethod )
        {
            ThreadPool.QueueUserWorkItem( x =>
            {
                try
                {
                    ThreadMethod();
                }
                catch ( Exception ex )
                {
                    //ToDo:
                    //ExceptionHandling!
                }
            } );
        }

        public static void QueueUserWorkItem<T>( Action<T> ThreadMethod, T MethodParam )
        {
            ThreadPool.QueueUserWorkItem( x =>
            {
                try
                {
                    ThreadMethod( MethodParam );
                }
                catch ( Exception ex )
                {
                    //ToDo:
                    //ExceptionHandling!
                }
            } );
        } 

		public static void InvokeMethod( Action MethodToInvoke )
        {
            if ( !disObject.CheckAccess() )
            {
                disObject.BeginInvoke( new Action( MethodToInvoke ) );
            }
            else
            {
                MethodToInvoke();
            }
        } 
		
        public static void InvokeMethod<T>( Action<T> MethodToInvoke, T MethodParam )
        {
            if ( !disObject.CheckAccess() )
            {
                disObject.BeginInvoke( new Action( () => MethodToInvoke( MethodParam ) ) );
            }
            else
            {
                MethodToInvoke( MethodParam );
            }
        } 

    }

hier mal ein Beispiel wie es verwendet werden kann


            public static void Execute()
            {
                csThreading.QueueUserWorkItem( ExecuteThread );
            }

		    private static void ExecuteThread()
		    {
			    //Viel Code
                csThreading.InvokeMethod(RaiseExecuteCompletedEvent, new ExecuteCompletedEventArgs( "SomeResult" ) );
		    }


		    private void RaiseExecuteCompletedEvent(ExecuteCompletedEventArgs e)
		    {
			    if ( ExecuteCompletedEvent != null )
                {
                    ExecuteCompletedEvent( this, e );
                }
		    }

            public event ExecuteCompletedEventHandler ExecuteCompletedEvent;

Schlagwörter: Threading Thread ThreadPool

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo ProGamer,

auch wenn ich kein Fan des BackgroundWorkers bin, würde ich doch dafür plädieren, diesen zu benutzen, statt eine sehr ähnliche Funktionalität nachzuprogrammieren.

Der BackgroundWorkers bietet alles, was auch dein Snippet bietet. Darüber hinaus ermöglicht er es, das Exceptionhandling dem Aufrufer zu überlassen (RunWorkerCompletedEventArgs.Error) und damit in Abhängigkeit von der tatsächlich ausgeführten Methode zu reagieren. Das "//ToDo: ExceptionHandling!" wird damit einerseits dem Aufrufer überlassen (er muss sich also darum kümmern), anderseits auch ermöglicht (er kann sich also darum kümmern). Das ist sicher besser, als das Exceptionhandling pauschal in eine ansonsten allgemeinverwendbare Klasse einzubauen.

herbivore