Avatar billede jackass- Nybegynder
12. maj 2007 - 02:15 Der er 18 kommentarer og
1 løsning

Forms og threading

Hej,

Jeg er newbie i C# så håber nogen kan hjælpe med følgende:

Jeg roder med en lille irc klient som "lær-noget-C#-projekt" og har en background thread som lytter på events fra serveren.

Så har jeg en eventhandler som skal output'e teksten fra serveren til textbox1, den ser således ud:

public static void OnRawMessage(object sender, IrcEventArgs e)
{
  //this.textBox1.AppendText("Received: " + e.Data.RawMessage);
  //MessageBox.Show(e.Data.RawMessage, "");
}

Problemet er, at jeg tilsyneladende ikke kan access'e textBox1 hverken med eller uden "this." fordi eventhandleren er static.. og hvis jeg i stedet tester med MessageBox.Show "hænger" min form imellem disse "popups".

Er der nogen der kan hjælpe mig videre med dette form/multithreading problem?

PS: hvis det er nogen hjælp, benytter jeg dette library til min klient: http://smartirc4net.meebey.net/jaws/

På forhånd tusind tak! :)

Med venlig hilsen,
/jack
Avatar billede dr_chaos Nybegynder
12. maj 2007 - 07:57 #1
Hvorfor vil du have den static ?
Det gør man normalt ikke med event handlers.
Avatar billede jackass- Nybegynder
12. maj 2007 - 11:52 #2
Selve eventhandleren er vist heller ikke;

public delegate void IrcEventHandler(
  object sender,
  IrcEventArgs e
);

..men.. jeg ved det ikke, har ikke forstand på det, sådan er det bare skrevet i dokumentationen på http://smartirc4net.meebey.net/docs/0.4.0/html/.

Kan du/I se noget ud af det og evt. give et eksempel eller lign.? :)
Avatar billede dr_chaos Nybegynder
12. maj 2007 - 13:02 #3
prøv bare med:
public void OnRawMessage(object sender, IrcEventArgs e)
{
Avatar billede jackass- Nybegynder
12. maj 2007 - 17:03 #4
Det er den mindste del, det med at opdatere textbox1.. Jeg ville meget gerne om nogen kunne hjælpe mht threading sådan at formen ikke "hænger"? :)
Avatar billede dr_chaos Nybegynder
12. maj 2007 - 20:17 #5
Vil du lave multithreading for at vise en messagebox ?
Avatar billede jackass- Nybegynder
13. maj 2007 - 00:19 #6
Nejnej.. jeg kalder en listener med irc.Listen(); som lytter på servermessages og er aktiv hele tiden.. det skal den gøre i en "baggrunds-tråd" for at formen ikke skal hænge (som jeg har forstået det?). Og det er det jeg har lidt problemer med at få til at spille..
Avatar billede dr_chaos Nybegynder
13. maj 2007 - 08:47 #7
Du kan kigge på en background worker.
Her er en som understøtter annullering:
///Created by Roy Osherove, Team Agile
/// Blog: www.ISerializable.com
/// Roy@TeamAgile.com
namespace WindowsApplication2
{
    using System;
    using System.Runtime.CompilerServices;
    using System.Security.Permissions;
    using System.Threading;
    using System.ComponentModel;

/// <summary>
/// Replaces the standard BackgroundWorker Component in .NET 2.0 Winforms
/// To support the ability of aborting the thread the worker is using,
///and supporting the fast proporgation of ProgressChanged events without locking up
/// </summary>
/// <remarks></remarks>
    public class BackgroundWorkerEx : Component
    {
        // Events
        public event DoWorkEventHandler DoWork
        {
            add
            {
                base.Events.AddHandler(BackgroundWorkerEx.doWorkKey, value);
            }
            remove
            {
                base.Events.RemoveHandler(BackgroundWorkerEx.doWorkKey, value);
            }
        }
        public event ProgressChangedEventHandler ProgressChanged
        {
            add
            {
                base.Events.AddHandler(BackgroundWorkerEx.progressChangedKey, value);
            }
            remove
            {
                base.Events.RemoveHandler(BackgroundWorkerEx.progressChangedKey, value);
            }
        }
        public event RunWorkerCompletedEventHandler RunWorkerCompleted
        {
            add
            {
                base.Events.AddHandler(BackgroundWorkerEx.runWorkerCompletedKey, value);
            }
            remove
            {
                base.Events.RemoveHandler(BackgroundWorkerEx.runWorkerCompletedKey, value);
            }
        }

        // Methods
        static BackgroundWorkerEx()
        {
            BackgroundWorkerEx.doWorkKey = new object();
            BackgroundWorkerEx.runWorkerCompletedKey = new object();
            BackgroundWorkerEx.progressChangedKey = new object();
        }

        public BackgroundWorkerEx()
        {
            this.threadStart = new WorkerThreadStartDelegate(this.WorkerThreadStart);
            this.operationCompleted = new SendOrPostCallback(this.AsyncOperationCompleted);
            this.progressReporter = new SendOrPostCallback(this.ProgressReporter);
        }

        private void AsyncOperationCompleted(object arg)
        {
            this.isRunning = false;
            this.cancellationPending = false;
            this.OnRunWorkerCompleted((RunWorkerCompletedEventArgs)arg);
        }

        public void CancelAsync()
        {
            if (!this.WorkerSupportsCancellation)
            {
                throw new InvalidOperationException("BackgroundWorker_WorkerDoesntSupportCancellation");
            }
            this.cancellationPending = true;
        }

        protected virtual void OnDoWork(DoWorkEventArgs e)
        {
            mThread = Thread.CurrentThread;
            DoWorkEventHandler workStartDelegate = (DoWorkEventHandler)base.Events[BackgroundWorkerEx.doWorkKey];
            if (workStartDelegate != null)
            {
                try
                {
                    workStartDelegate(this, e);
                }
                catch (ThreadAbortException)
                {
                    Thread.ResetAbort();
                }
            }
        }

        private object tempLock = new object();
        protected virtual void OnProgressChanged(ProgressChangedEventArgs e)
        {
            ProgressChangedEventHandler progressChangedDelegate = (ProgressChangedEventHandler)base.Events[BackgroundWorkerEx.progressChangedKey];
            if (progressChangedDelegate != null)
            {
                progressChangedDelegate(this, e);
            }
        }

        protected virtual void OnRunWorkerCompleted(RunWorkerCompletedEventArgs e)
        {
            RunWorkerCompletedEventHandler workderCompletedDelegate = (RunWorkerCompletedEventHandler)base.Events[BackgroundWorkerEx.runWorkerCompletedKey];
            if (workderCompletedDelegate != null)
            {
                workderCompletedDelegate(this, e);
            }
        }

        private void ProgressReporter(object arg)
        {
            this.OnProgressChanged((ProgressChangedEventArgs)arg);
        }

        public void ReportProgress(int percentProgress)
        {
            this.ReportProgress(percentProgress, null);
        }

        public void ReportProgress(int percentProgress, object userState)
        {
            if (!this.WorkerReportsProgress)
            {
                throw new InvalidOperationException("BackgroundWorker_WorkerDoesntReportProgress");
            }
            ProgressChangedEventArgs progressArgs = new ProgressChangedEventArgs(percentProgress, userState);
            object lockTarget = new object();
            if (this.asyncOperation != null)
            {
                this.asyncOperation.Post(this.progressReporter, progressArgs);
              // Thread.Sleep(10);
            }
            else
            {
                this.progressReporter(progressArgs);
            }
        }

        public void RunWorkerAsync()
        {
            this.RunWorkerAsync(null);
        }

        private Thread mThread;
        public void StopImmediately()
        {
            if (!IsBusy || mThread == null)
            {
                return;
            }
            else
            {
                mThread.Abort();
                //there is no need to catch a threadAbortException
                //since we are catching it and resetting it inside the OnDoWork method
            }
           

            RunWorkerCompletedEventArgs completedArgs =
                new RunWorkerCompletedEventArgs(null, null, true);
            if (asyncOperation != null)
            {
                //invoke operation on the correct thread
                asyncOperation.PostOperationCompleted(operationCompleted, completedArgs);
            }
            else
            {
                //invoke operation directly
                operationCompleted(completedArgs);
            }
        }

        public void RunWorkerAsync(object argument)
        {
            if (this.isRunning)
            {
                throw new InvalidOperationException("BackgroundWorker_WorkerAlreadyRunning");
            }
            this.isRunning = true;
            this.cancellationPending = false;
            this.asyncOperation = AsyncOperationManager.CreateOperation(null);
            this.threadStart.BeginInvoke(argument, null, null);
        }

        private void WorkerThreadStart(object userState)
        {
            object result = null;
            Exception workerException = null;
            bool cancel = false;
            try
            {
                DoWorkEventArgs workArgs = new DoWorkEventArgs(userState);
                this.OnDoWork(workArgs);
                if (workArgs.Cancel)
                {
                    cancel = true;
                }
                else
                {
                    result = workArgs.Result;
                }
            }
            catch (Exception ex)
            {
                workerException = ex;
            }
            RunWorkerCompletedEventArgs completedArgs = new RunWorkerCompletedEventArgs(result, workerException, cancel);
            if (isRunning)
            {
                this.asyncOperation.PostOperationCompleted(this.operationCompleted, completedArgs);
            }
        }


        // Properties
        public bool CancellationPending
        {
            get
            {
                return this.cancellationPending;
            }
        }

        public bool IsBusy
        {
            get
            {
                return this.isRunning;
            }
        }

        public bool WorkerReportsProgress
        {
            get
            {
                return this.workerReportsProgress;
            }
            set
            {
                this.workerReportsProgress = value;
            }
        }

        public bool WorkerSupportsCancellation
        {
            get
            {
                return this.canCancelWorker;
            }
            set
            {
                this.canCancelWorker = value;
            }
        }


        // Fields
        private AsyncOperation asyncOperation;
        private bool canCancelWorker;
        private bool cancellationPending;
        private static readonly object doWorkKey;
        private bool isRunning;
        private readonly SendOrPostCallback operationCompleted;
        private static readonly object progressChangedKey;
        private readonly SendOrPostCallback progressReporter;
        private static readonly object runWorkerCompletedKey;
        private readonly WorkerThreadStartDelegate threadStart;
        private bool workerReportsProgress;

        // Nested Types
        private delegate void WorkerThreadStartDelegate(object argument);

    }
}
Avatar billede dr_chaos Nybegynder
13. maj 2007 - 08:50 #8
Du bruger den med:
WindowsApplication2.BackgroundWorkerEx bgWorker = new WindowsApplication2.BackgroundWorkerEx();
this.bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgressChanged);
            this.bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
            this.bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {

          //kald metode som starter din listener.
        }

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
//denne metode kaldes når workeren er færdig.
}

void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
//her kan du sende et tal tilbage til den original tråd.
}
Avatar billede jackass- Nybegynder
13. maj 2007 - 21:37 #9
Det ser godt ud.. men jeg får nogle fejl når jeg forsøger at compile. Jeg smider lige hele koden her, hvis du får lyst til at fejlsøge lidt (please? :D ):


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.CompilerServices;
using System.Security.Permissions;
using System.Threading;
using Meebey.SmartIrc4net;

namespace Botte
{
    public partial class mainForm : Form
    {
        public static IrcClient irc = new IrcClient();

        public mainForm()
        {
            InitializeComponent();
        }

        private void btnConnect_Click(object sender, EventArgs e)
        {
            // liste af irc servere
            string[] serverlist = new string[] { "irc.inet.tele.dk" };

            // irc port
            int port = 6667;

            // kanalen
            string channel = "#test.chan";

            Thread.CurrentThread.Name = "Main";

            irc.SendDelay = 200;
            irc.ActiveChannelSyncing = true;

            irc.OnQueryMessage += new IrcEventHandler(OnQueryMessage);
            irc.OnError += new ErrorEventHandler(OnError);
            irc.OnRawMessage += new IrcEventHandler(OnRawMessage);
           
            // forbindelse til server.
            try { irc.Connect(serverlist, port); }
            catch (ConnectionException s)
            {
                textBox1.AppendText("Couldn't connect! Reason: " + s.Message); // hvis der opstår en fejl..
                Exit();
            }

            try
            {
                // login
                irc.Login("Muh--", "ja davs");

                // join
                irc.RfcJoin(channel);

                // testbesked (til kanal)
                irc.SendMessage(SendType.Message, channel, "b0000");

                // spawn ny tråd ( handles af ReadMsg() )
                //new Thread(new ThreadStart(ReadMsg)).Start();
                //    Thread t = new Thread(new ThreadStart(ReadMsg));
                //t.IsBackground = true;
                //t.Name = "Listener";
                //t.Start();

                WindowsApplication3.BackgroundWorkerEx bgWorker = new WindowsApplication3.BackgroundWorkerEx();
                this.bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgressChanged);
                this.bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
                this.bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
               
                void bgWorker_DoWork(object sender, DoWorkEventArgs e)
                {
                    irc.Listen();
                }
               
                void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
                {
                    //denne metode kaldes når workeren er færdig.
                }

                void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
                {
                    //her kan du sende et tal tilbage til den original tråd.
                }

                // når lytteren returnerer (lukker), bør forbindelsen til irc lukkes.
                if (irc.IsConnected)
                {
                    irc.Disconnect();
                }
            }
            catch (ConnectionException)
            {
                Exit();
            }
        }

        public static void ReadMsg()
        {
            // skriv input i konsollen.
            while (true)
            {
                //irc.WriteLine("hejsa");
            }
        }

        public static void Exit()
        {
            System.Environment.Exit(0);
        }

        public static void OnError(object sender, ErrorEventArgs e)
        {
            MessageBox.Show("hej", "blaah");
            //this.textBox1.AppendText(e.Data.RawMessage);
            //("Error: " + e.ErrorMessage);

        }
        public static void OnQueryMessage(object sender, IrcEventArgs e)
        {
            //this.textBox1.AppendText(e.Data.RawMessage);
            MessageBox.Show(e.Data.Message, "blaah");
        }

        public static void OnRawMessage(object sender, IrcEventArgs e)
        {
            //textBox1.AppendText("Received: " + e.Data.RawMessage);
            //MessageBox.Show(e.Data.RawMessage, "blaah");

        }       
    }

    public class BackgroundWorkerEx : Component
    {
        // Events
        public event DoWorkEventHandler DoWork
        {
            add
            {
                base.Events.AddHandler(BackgroundWorkerEx.doWorkKey, value);
            }
            remove
            {
                base.Events.RemoveHandler(BackgroundWorkerEx.doWorkKey, value);
            }
        }
        public event ProgressChangedEventHandler ProgressChanged
        {
            add
            {
                base.Events.AddHandler(BackgroundWorkerEx.progressChangedKey, value);
            }
            remove
            {
                base.Events.RemoveHandler(BackgroundWorkerEx.progressChangedKey, value);
            }
        }
        public event RunWorkerCompletedEventHandler RunWorkerCompleted
        {
            add
            {
                base.Events.AddHandler(BackgroundWorkerEx.runWorkerCompletedKey, value);
            }
            remove
            {
                base.Events.RemoveHandler(BackgroundWorkerEx.runWorkerCompletedKey, value);
            }
        }

        // Methods
        static BackgroundWorkerEx()
        {
            BackgroundWorkerEx.doWorkKey = new object();
            BackgroundWorkerEx.runWorkerCompletedKey = new object();
            BackgroundWorkerEx.progressChangedKey = new object();
        }

        public BackgroundWorkerEx()
        {
            this.threadStart = new WorkerThreadStartDelegate(this.WorkerThreadStart);
            this.operationCompleted = new SendOrPostCallback(this.AsyncOperationCompleted);
            this.progressReporter = new SendOrPostCallback(this.ProgressReporter);
        }

        private void AsyncOperationCompleted(object arg)
        {
            this.isRunning = false;
            this.cancellationPending = false;
            this.OnRunWorkerCompleted((RunWorkerCompletedEventArgs)arg);
        }

        public void CancelAsync()
        {
            if (!this.WorkerSupportsCancellation)
            {
                throw new InvalidOperationException("BackgroundWorker_WorkerDoesntSupportCancellation");
            }
            this.cancellationPending = true;
        }

        protected virtual void OnDoWork(DoWorkEventArgs e)
        {
            mThread = Thread.CurrentThread;
            DoWorkEventHandler workStartDelegate = (DoWorkEventHandler)base.Events[BackgroundWorkerEx.doWorkKey];
            if (workStartDelegate != null)
            {
                try
                {
                    workStartDelegate(this, e);
                }
                catch (ThreadAbortException)
                {
                    Thread.ResetAbort();
                }
            }
        }

        private object tempLock = new object();
        protected virtual void OnProgressChanged(ProgressChangedEventArgs e)
        {
            ProgressChangedEventHandler progressChangedDelegate = (ProgressChangedEventHandler)base.Events[BackgroundWorkerEx.progressChangedKey];
            if (progressChangedDelegate != null)
            {
                progressChangedDelegate(this, e);
            }
        }

        protected virtual void OnRunWorkerCompleted(RunWorkerCompletedEventArgs e)
        {
            RunWorkerCompletedEventHandler workderCompletedDelegate = (RunWorkerCompletedEventHandler)base.Events[BackgroundWorkerEx.runWorkerCompletedKey];
            if (workderCompletedDelegate != null)
            {
                workderCompletedDelegate(this, e);
            }
        }

        private void ProgressReporter(object arg)
        {
            this.OnProgressChanged((ProgressChangedEventArgs)arg);
        }

        public void ReportProgress(int percentProgress)
        {
            this.ReportProgress(percentProgress, null);
        }

        public void ReportProgress(int percentProgress, object userState)
        {
            if (!this.WorkerReportsProgress)
            {
                throw new InvalidOperationException("BackgroundWorker_WorkerDoesntReportProgress");
            }
            ProgressChangedEventArgs progressArgs = new ProgressChangedEventArgs(percentProgress, userState);
            object lockTarget = new object();
            if (this.asyncOperation != null)
            {
                this.asyncOperation.Post(this.progressReporter, progressArgs);
                // Thread.Sleep(10);
            }
            else
            {
                this.progressReporter(progressArgs);
            }
        }

        public void RunWorkerAsync()
        {
            this.RunWorkerAsync(null);
        }

        private Thread mThread;
        public void StopImmediately()
        {
            if (!IsBusy || mThread == null)
            {
                return;
            }
            else
            {
                mThread.Abort();
                //there is no need to catch a threadAbortException
                //since we are catching it and resetting it inside the OnDoWork method
            }


            RunWorkerCompletedEventArgs completedArgs =
                new RunWorkerCompletedEventArgs(null, null, true);
            if (asyncOperation != null)
            {
                //invoke operation on the correct thread
                asyncOperation.PostOperationCompleted(operationCompleted, completedArgs);
            }
            else
            {
                //invoke operation directly
                operationCompleted(completedArgs);
            }
        }

        public void RunWorkerAsync(object argument)
        {
            if (this.isRunning)
            {
                throw new InvalidOperationException("BackgroundWorker_WorkerAlreadyRunning");
            }
            this.isRunning = true;
            this.cancellationPending = false;
            this.asyncOperation = AsyncOperationManager.CreateOperation(null);
            this.threadStart.BeginInvoke(argument, null, null);
        }

        private void WorkerThreadStart(object userState)
        {
            object result = null;
            Exception workerException = null;
            bool cancel = false;
            try
            {
                DoWorkEventArgs workArgs = new DoWorkEventArgs(userState);
                this.OnDoWork(workArgs);
                if (workArgs.Cancel)
                {
                    cancel = true;
                }
                else
                {
                    result = workArgs.Result;
                }
            }
            catch (Exception ex)
            {
                workerException = ex;
            }
            RunWorkerCompletedEventArgs completedArgs = new RunWorkerCompletedEventArgs(result, workerException, cancel);
            if (isRunning)
            {
                this.asyncOperation.PostOperationCompleted(this.operationCompleted, completedArgs);
            }
        }


        // Properties
        public bool CancellationPending
        {
            get
            {
                return this.cancellationPending;
            }
        }

        public bool IsBusy
        {
            get
            {
                return this.isRunning;
            }
        }

        public bool WorkerReportsProgress
        {
            get
            {
                return this.workerReportsProgress;
            }
            set
            {
                this.workerReportsProgress = value;
            }
        }

        public bool WorkerSupportsCancellation
        {
            get
            {
                return this.canCancelWorker;
            }
            set
            {
                this.canCancelWorker = value;
            }
        }


        // Fields
        private AsyncOperation asyncOperation;
        private bool canCancelWorker;
        private bool cancellationPending;
        private static readonly object doWorkKey;
        private bool isRunning;
        private readonly SendOrPostCallback operationCompleted;
        private static readonly object progressChangedKey;
        private readonly SendOrPostCallback progressReporter;
        private static readonly object runWorkerCompletedKey;
        private readonly WorkerThreadStartDelegate threadStart;
        private bool workerReportsProgress;

        // Nested Types
        private delegate void WorkerThreadStartDelegate(object argument);

    }

}
Avatar billede dr_chaos Nybegynder
13. maj 2007 - 21:40 #10
Det vil hjælpe at få fejlmeddelelserne :)
Avatar billede jackass- Nybegynder
13. maj 2007 - 21:42 #11
Naturligvis hehe.. de kommer her.. fejl nr. 1 er efter linien:

this.bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);

..hvor den siger "} expected" .. her er resten :

Error    1    } expected    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    73    81    WindowsApplication3
Error    2    Invalid token 'if' in class, struct, or interface member declaration    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    91    17    WindowsApplication3
Error    3    Invalid token ')' in class, struct, or interface member declaration    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    91    36    WindowsApplication3
Error    4    Invalid token '(' in class, struct, or interface member declaration    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    93    35    WindowsApplication3
Error    5    A namespace does not directly contain members such as fields or methods    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    96    13    WindowsApplication3
Error    6    Type or namespace definition, or end-of-file expected    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    100    9    WindowsApplication3
Error    7    Keyword 'void' cannot be used in this context    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    75    17    WindowsApplication3
Error    8    Expected ; or = (cannot specify constructor arguments in declaration)    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    75    37    WindowsApplication3
Error    9    Invalid expression term 'object'    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    75    45    WindowsApplication3
Error    10    ) expected    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    75    69    WindowsApplication3
Error    11    ; expected    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    75    70    WindowsApplication3
Error    12    Invalid expression term ')'    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    75    70    WindowsApplication3
Error    13    ; expected    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    75    71    WindowsApplication3
Error    14    Keyword 'void' cannot be used in this context    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    80    17    WindowsApplication3
Error    15    Expected ; or = (cannot specify constructor arguments in declaration)    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    80    49    WindowsApplication3
Error    16    Invalid expression term 'object'    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    80    57    WindowsApplication3
Error    17    ) expected    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    80    93    WindowsApplication3
Error    18    ; expected    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    80    94    WindowsApplication3
Error    19    Invalid expression term ')'    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    80    94    WindowsApplication3
Error    20    ; expected    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    80    95    WindowsApplication3
Error    21    Keyword 'void' cannot be used in this context    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    85    17    WindowsApplication3
Error    22    Expected ; or = (cannot specify constructor arguments in declaration)    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    85    46    WindowsApplication3
Error    23    Invalid expression term 'object'    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    85    54    WindowsApplication3
Error    24    ) expected    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    85    87    WindowsApplication3
Error    25    ; expected    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    85    88    WindowsApplication3
Error    26    Invalid expression term ')'    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    85    88    WindowsApplication3
Error    27    ; expected    C:\Documents and Settings\Dokumenter\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs    85    89    WindowsApplication3
Avatar billede dr_chaos Nybegynder
13. maj 2007 - 21:50 #12
prøv med:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.CompilerServices;
using System.Security.Permissions;
using System.Threading;
using Meebey.SmartIrc4net;

namespace Botte
{
    public partial class mainForm : Form
    {
        public static IrcClient irc = new IrcClient();

        public mainForm()
        {
            InitializeComponent();
            WindowsApplication3.BackgroundWorkerEx bgWorker = new WindowsApplication3.BackgroundWorkerEx();
            this.bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgressChanged);
            this.bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
            this.bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
        }
        private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            irc.Listen();
        }

        private void  bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //denne metode kaldes når workeren er færdig.
        }

        private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //her kan du sende et tal tilbage til den original tråd.
        }
        private void btnConnect_Click(object sender, EventArgs e)
        {
            // liste af irc servere
            string[] serverlist = new string[] { "irc.inet.tele.dk" };

            // irc port
            int port = 6667;

            // kanalen
            string channel = "#test.chan";

            Thread.CurrentThread.Name = "Main";

            irc.SendDelay = 200;
            irc.ActiveChannelSyncing = true;

            irc.OnQueryMessage += new IrcEventHandler(OnQueryMessage);
            irc.OnError += new ErrorEventHandler(OnError);
            irc.OnRawMessage += new IrcEventHandler(OnRawMessage);
         
            // forbindelse til server.
            try { irc.Connect(serverlist, port); }
            catch (ConnectionException s)
            {
                textBox1.AppendText("Couldn't connect! Reason: " + s.Message); // hvis der opstår en fejl..
                Exit();
            }

            try
            {
                // login
                irc.Login("Muh--", "ja davs");

                // join
                irc.RfcJoin(channel);

                // testbesked (til kanal)
                irc.SendMessage(SendType.Message, channel, "b0000");

                // spawn ny tråd ( handles af ReadMsg() )
                //new Thread(new ThreadStart(ReadMsg)).Start();
                //    Thread t = new Thread(new ThreadStart(ReadMsg));
                //t.IsBackground = true;
                //t.Name = "Listener";
                //t.Start();


                this.bgWorker.RunWorkerAsync();
             

                // når lytteren returnerer (lukker), bør forbindelsen til irc lukkes.
                if (irc.IsConnected)
                {
                    irc.Disconnect();
                }
            }
            catch (ConnectionException)
            {
                Exit();
            }
        }

        public static void ReadMsg()
        {
            // skriv input i konsollen.
            while (true)
            {
                //irc.WriteLine("hejsa");
            }
        }

        public static void Exit()
        {
            System.Environment.Exit(0);
        }

        public static void OnError(object sender, ErrorEventArgs e)
        {
            MessageBox.Show("hej", "blaah");
            //this.textBox1.AppendText(e.Data.RawMessage);
            //("Error: " + e.ErrorMessage);

        }
        public static void OnQueryMessage(object sender, IrcEventArgs e)
        {
            //this.textBox1.AppendText(e.Data.RawMessage);
            MessageBox.Show(e.Data.Message, "blaah");
        }

        public static void OnRawMessage(object sender, IrcEventArgs e)
        {
            //textBox1.AppendText("Received: " + e.Data.RawMessage);
            //MessageBox.Show(e.Data.RawMessage, "blaah");

        }     
    }

    public class BackgroundWorkerEx : Component
    {
        // Events
        public event DoWorkEventHandler DoWork
        {
            add
            {
                base.Events.AddHandler(BackgroundWorkerEx.doWorkKey, value);
            }
            remove
            {
                base.Events.RemoveHandler(BackgroundWorkerEx.doWorkKey, value);
            }
        }
        public event ProgressChangedEventHandler ProgressChanged
        {
            add
            {
                base.Events.AddHandler(BackgroundWorkerEx.progressChangedKey, value);
            }
            remove
            {
                base.Events.RemoveHandler(BackgroundWorkerEx.progressChangedKey, value);
            }
        }
        public event RunWorkerCompletedEventHandler RunWorkerCompleted
        {
            add
            {
                base.Events.AddHandler(BackgroundWorkerEx.runWorkerCompletedKey, value);
            }
            remove
            {
                base.Events.RemoveHandler(BackgroundWorkerEx.runWorkerCompletedKey, value);
            }
        }

        // Methods
        static BackgroundWorkerEx()
        {
            BackgroundWorkerEx.doWorkKey = new object();
            BackgroundWorkerEx.runWorkerCompletedKey = new object();
            BackgroundWorkerEx.progressChangedKey = new object();
        }

        public BackgroundWorkerEx()
        {
            this.threadStart = new WorkerThreadStartDelegate(this.WorkerThreadStart);
            this.operationCompleted = new SendOrPostCallback(this.AsyncOperationCompleted);
            this.progressReporter = new SendOrPostCallback(this.ProgressReporter);
        }

        private void AsyncOperationCompleted(object arg)
        {
            this.isRunning = false;
            this.cancellationPending = false;
            this.OnRunWorkerCompleted((RunWorkerCompletedEventArgs)arg);
        }

        public void CancelAsync()
        {
            if (!this.WorkerSupportsCancellation)
            {
                throw new InvalidOperationException("BackgroundWorker_WorkerDoesntSupportCancellation");
            }
            this.cancellationPending = true;
        }

        protected virtual void OnDoWork(DoWorkEventArgs e)
        {
            mThread = Thread.CurrentThread;
            DoWorkEventHandler workStartDelegate = (DoWorkEventHandler)base.Events[BackgroundWorkerEx.doWorkKey];
            if (workStartDelegate != null)
            {
                try
                {
                    workStartDelegate(this, e);
                }
                catch (ThreadAbortException)
                {
                    Thread.ResetAbort();
                }
            }
        }

        private object tempLock = new object();
        protected virtual void OnProgressChanged(ProgressChangedEventArgs e)
        {
            ProgressChangedEventHandler progressChangedDelegate = (ProgressChangedEventHandler)base.Events[BackgroundWorkerEx.progressChangedKey];
            if (progressChangedDelegate != null)
            {
                progressChangedDelegate(this, e);
            }
        }

        protected virtual void OnRunWorkerCompleted(RunWorkerCompletedEventArgs e)
        {
            RunWorkerCompletedEventHandler workderCompletedDelegate = (RunWorkerCompletedEventHandler)base.Events[BackgroundWorkerEx.runWorkerCompletedKey];
            if (workderCompletedDelegate != null)
            {
                workderCompletedDelegate(this, e);
            }
        }

        private void ProgressReporter(object arg)
        {
            this.OnProgressChanged((ProgressChangedEventArgs)arg);
        }

        public void ReportProgress(int percentProgress)
        {
            this.ReportProgress(percentProgress, null);
        }

        public void ReportProgress(int percentProgress, object userState)
        {
            if (!this.WorkerReportsProgress)
            {
                throw new InvalidOperationException("BackgroundWorker_WorkerDoesntReportProgress");
            }
            ProgressChangedEventArgs progressArgs = new ProgressChangedEventArgs(percentProgress, userState);
            object lockTarget = new object();
            if (this.asyncOperation != null)
            {
                this.asyncOperation.Post(this.progressReporter, progressArgs);
                // Thread.Sleep(10);
            }
            else
            {
                this.progressReporter(progressArgs);
            }
        }

        public void RunWorkerAsync()
        {
            this.RunWorkerAsync(null);
        }

        private Thread mThread;
        public void StopImmediately()
        {
            if (!IsBusy || mThread == null)
            {
                return;
            }
            else
            {
                mThread.Abort();
                //there is no need to catch a threadAbortException
                //since we are catching it and resetting it inside the OnDoWork method
            }


            RunWorkerCompletedEventArgs completedArgs =
                new RunWorkerCompletedEventArgs(null, null, true);
            if (asyncOperation != null)
            {
                //invoke operation on the correct thread
                asyncOperation.PostOperationCompleted(operationCompleted, completedArgs);
            }
            else
            {
                //invoke operation directly
                operationCompleted(completedArgs);
            }
        }

        public void RunWorkerAsync(object argument)
        {
            if (this.isRunning)
            {
                throw new InvalidOperationException("BackgroundWorker_WorkerAlreadyRunning");
            }
            this.isRunning = true;
            this.cancellationPending = false;
            this.asyncOperation = AsyncOperationManager.CreateOperation(null);
            this.threadStart.BeginInvoke(argument, null, null);
        }

        private void WorkerThreadStart(object userState)
        {
            object result = null;
            Exception workerException = null;
            bool cancel = false;
            try
            {
                DoWorkEventArgs workArgs = new DoWorkEventArgs(userState);
                this.OnDoWork(workArgs);
                if (workArgs.Cancel)
                {
                    cancel = true;
                }
                else
                {
                    result = workArgs.Result;
                }
            }
            catch (Exception ex)
            {
                workerException = ex;
            }
            RunWorkerCompletedEventArgs completedArgs = new RunWorkerCompletedEventArgs(result, workerException, cancel);
            if (isRunning)
            {
                this.asyncOperation.PostOperationCompleted(this.operationCompleted, completedArgs);
            }
        }


        // Properties
        public bool CancellationPending
        {
            get
            {
                return this.cancellationPending;
            }
        }

        public bool IsBusy
        {
            get
            {
                return this.isRunning;
            }
        }

        public bool WorkerReportsProgress
        {
            get
            {
                return this.workerReportsProgress;
            }
            set
            {
                this.workerReportsProgress = value;
            }
        }

        public bool WorkerSupportsCancellation
        {
            get
            {
                return this.canCancelWorker;
            }
            set
            {
                this.canCancelWorker = value;
            }
        }


        // Fields
        private AsyncOperation asyncOperation;
        private bool canCancelWorker;
        private bool cancellationPending;
        private static readonly object doWorkKey;
        private bool isRunning;
        private readonly SendOrPostCallback operationCompleted;
        private static readonly object progressChangedKey;
        private readonly SendOrPostCallback progressReporter;
        private static readonly object runWorkerCompletedKey;
        private readonly WorkerThreadStartDelegate threadStart;
        private bool workerReportsProgress;

        // Nested Types
        private delegate void WorkerThreadStartDelegate(object argument);

    }

}

hvis det ikke virker så prøv at fjerne den kode du tog fra mig.
Lav en ny fil kaldet
BackgroundWorkerEx.cs i dit projekt og smid koden derind.
Avatar billede dr_chaos Nybegynder
13. maj 2007 - 21:51 #13
Men du skal overveje meget hvordan du gør.
Avatar billede jackass- Nybegynder
13. maj 2007 - 23:13 #14
Argh det driller, har prøvet begge dele.. sorry jeg er så n00b. Jeg ved godt det er meget at spørge efter, men er der nogen som helst mulighed for at du kan sende mig et "working example"? :/
Avatar billede dr_chaos Nybegynder
14. maj 2007 - 09:54 #15
jeg kan prøve.
Hvilke yderligere fejl får du ?
Avatar billede jackass- Nybegynder
14. maj 2007 - 15:46 #16
Cirka de samme.. nok bare mig der kager rundt i det.. :/
Avatar billede dr_chaos Nybegynder
14. maj 2007 - 20:04 #17
Min form1 som kører asynkront:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Meebey.SmartIrc4net;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        WindowsApplication1.BackgroundWorkerEx bgWorker = new WindowsApplication1.BackgroundWorkerEx();
        public IrcClient irc = new IrcClient();
        public Form1()
        {
            InitializeComponent();

            this.bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgressChanged);
            this.bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
            this.bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
            //vi simulerer et tryk på knappen
            btnConnect_Click(null, new EventArgs());
        }
        private void btnConnect_Click(object sender, EventArgs e)
        {
            bgWorker.RunWorkerAsync();
        }
        public static void ReadMsg()
        {
            // skriv input i konsollen.
            while (true)
            {
                //irc.WriteLine("hejsa");
            }
        }

        /// <summary>
        /// metode som kobler sig til irc
        /// </summary>
        public void TestConnect()
        {
            // liste af irc servere
            string[] serverlist = new string[] { "irc.inet.tele.dk" };

            // irc port
            int port = 6667;

            // kanalen
            string channel = "#test.chan";



            irc.SendDelay = 200;
            irc.ActiveChannelSyncing = true;

            irc.OnQueryMessage += new IrcEventHandler(OnQueryMessage);
            irc.OnError += new ErrorEventHandler(OnError);
            irc.OnRawMessage += new IrcEventHandler(OnRawMessage);

            // forbindelse til server.
            try { irc.Connect(serverlist, port); }
            catch (ConnectionException s)
            {
                MessageBox.Show("Couldn't connect! Reason: " + s.Message); // hvis der opstår en fejl..
                Exit();
            }

            try
            {
                // login
                irc.Login("Muh--", "ja davs");

                // join
                irc.RfcJoin(channel);

                // testbesked (til kanal)
                irc.SendMessage(SendType.Message, channel, "b0000");

                // spawn ny tråd ( handles af ReadMsg() )
                //new Thread(new ThreadStart(ReadMsg)).Start();
                //    Thread t = new Thread(new ThreadStart(ReadMsg));
                //t.IsBackground = true;
                //t.Name = "Listener";
                //t.Start();

                irc.Listen();


                // når lytteren returnerer (lukker), bør forbindelsen til irc lukkes.
                if (irc.IsConnected)
                {
                    irc.Disconnect();
                }
            }
            catch (ConnectionException)
            {
                Exit();
            }
        }
        public void Exit()
        {
            System.Environment.Exit(0);
        }

        public void OnError(object sender, ErrorEventArgs e)
        {
            MessageBox.Show("hej", "blaah");
            //this.textBox1.AppendText(e.Data.RawMessage);
            //("Error: " + e.ErrorMessage);

        }
        public void OnQueryMessage(object sender, IrcEventArgs e)
        {
            //this.textBox1.AppendText(e.Data.RawMessage);
            MessageBox.Show(e.Data.Message, "blaah");
        }

        public void OnRawMessage(object sender, IrcEventArgs e)
        {
            //textBox1.AppendText("Received: " + e.Data.RawMessage);
            //MessageBox.Show(e.Data.RawMessage, "blaah");

        }

        void bgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            TestConnect();
        }

        void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("færdig");
        }

        void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //her kan du sende et tal tilbage til den original tråd.
        }
    }
}
Avatar billede dr_chaos Nybegynder
14. maj 2007 - 20:05 #18
lav en class fil kaldet:
BackgroundWorkerEx.cs og indsæt nedenstående kode.

///Created by Roy Osherove, Team Agile
/// Blog: www.ISerializable.com
/// Roy@TeamAgile.com
namespace WindowsApplication1
{
    using System;
    using System.Runtime.CompilerServices;
    using System.Security.Permissions;
    using System.Threading;
    using System.ComponentModel;

    /// <summary>
    /// Replaces the standard BackgroundWorker Component in .NET 2.0 Winforms
    /// To support the ability of aborting the thread the worker is using,
    ///and supporting the fast proporgation of ProgressChanged events without locking up
    /// </summary>
    /// <remarks></remarks>
    public class BackgroundWorkerEx : Component
    {
        // Events
        public event DoWorkEventHandler DoWork
        {
            add
            {
                base.Events.AddHandler(BackgroundWorkerEx.doWorkKey, value);
            }
            remove
            {
                base.Events.RemoveHandler(BackgroundWorkerEx.doWorkKey, value);
            }
        }
        public event ProgressChangedEventHandler ProgressChanged
        {
            add
            {
                base.Events.AddHandler(BackgroundWorkerEx.progressChangedKey, value);
            }
            remove
            {
                base.Events.RemoveHandler(BackgroundWorkerEx.progressChangedKey, value);
            }
        }
        public event RunWorkerCompletedEventHandler RunWorkerCompleted
        {
            add
            {
                base.Events.AddHandler(BackgroundWorkerEx.runWorkerCompletedKey, value);
            }
            remove
            {
                base.Events.RemoveHandler(BackgroundWorkerEx.runWorkerCompletedKey, value);
            }
        }

        // Methods
        static BackgroundWorkerEx()
        {
            BackgroundWorkerEx.doWorkKey = new object();
            BackgroundWorkerEx.runWorkerCompletedKey = new object();
            BackgroundWorkerEx.progressChangedKey = new object();
        }

        public BackgroundWorkerEx()
        {
            this.threadStart = new WorkerThreadStartDelegate(this.WorkerThreadStart);
            this.operationCompleted = new SendOrPostCallback(this.AsyncOperationCompleted);
            this.progressReporter = new SendOrPostCallback(this.ProgressReporter);
        }

        private void AsyncOperationCompleted(object arg)
        {
            this.isRunning = false;
            this.cancellationPending = false;
            this.OnRunWorkerCompleted((RunWorkerCompletedEventArgs)arg);
        }

        public void CancelAsync()
        {
            if (!this.WorkerSupportsCancellation)
            {
                throw new InvalidOperationException("BackgroundWorker_WorkerDoesntSupportCancellation");
            }
            this.cancellationPending = true;
        }

        protected virtual void OnDoWork(DoWorkEventArgs e)
        {
            mThread = Thread.CurrentThread;
            DoWorkEventHandler workStartDelegate = (DoWorkEventHandler)base.Events[BackgroundWorkerEx.doWorkKey];
            if (workStartDelegate != null)
            {
                try
                {
                    workStartDelegate(this, e);
                }
                catch (ThreadAbortException)
                {
                    Thread.ResetAbort();
                }
            }
        }

        private object tempLock = new object();
        protected virtual void OnProgressChanged(ProgressChangedEventArgs e)
        {
            ProgressChangedEventHandler progressChangedDelegate = (ProgressChangedEventHandler)base.Events[BackgroundWorkerEx.progressChangedKey];
            if (progressChangedDelegate != null)
            {
                progressChangedDelegate(this, e);
            }
        }

        protected virtual void OnRunWorkerCompleted(RunWorkerCompletedEventArgs e)
        {
            RunWorkerCompletedEventHandler workderCompletedDelegate = (RunWorkerCompletedEventHandler)base.Events[BackgroundWorkerEx.runWorkerCompletedKey];
            if (workderCompletedDelegate != null)
            {
                workderCompletedDelegate(this, e);
            }
        }

        private void ProgressReporter(object arg)
        {
            this.OnProgressChanged((ProgressChangedEventArgs)arg);
        }

        public void ReportProgress(int percentProgress)
        {
            this.ReportProgress(percentProgress, null);
        }

        public void ReportProgress(int percentProgress, object userState)
        {
            if (!this.WorkerReportsProgress)
            {
                throw new InvalidOperationException("BackgroundWorker_WorkerDoesntReportProgress");
            }
            ProgressChangedEventArgs progressArgs = new ProgressChangedEventArgs(percentProgress, userState);
            object lockTarget = new object();
            if (this.asyncOperation != null)
            {
                this.asyncOperation.Post(this.progressReporter, progressArgs);
                // Thread.Sleep(10);
            }
            else
            {
                this.progressReporter(progressArgs);
            }
        }

        public void RunWorkerAsync()
        {
            this.RunWorkerAsync(null);
        }

        private Thread mThread;
        public void StopImmediately()
        {
            if (!IsBusy || mThread == null)
            {
                return;
            }
            else
            {
                mThread.Abort();
                //there is no need to catch a threadAbortException
                //since we are catching it and resetting it inside the OnDoWork method
            }


            RunWorkerCompletedEventArgs completedArgs =
                new RunWorkerCompletedEventArgs(null, null, true);
            if (asyncOperation != null)
            {
                //invoke operation on the correct thread
                asyncOperation.PostOperationCompleted(operationCompleted, completedArgs);
            }
            else
            {
                //invoke operation directly
                operationCompleted(completedArgs);
            }
        }

        public void RunWorkerAsync(object argument)
        {
            if (this.isRunning)
            {
                throw new InvalidOperationException("BackgroundWorker_WorkerAlreadyRunning");
            }
            this.isRunning = true;
            this.cancellationPending = false;
            this.asyncOperation = AsyncOperationManager.CreateOperation(null);
            this.threadStart.BeginInvoke(argument, null, null);
        }

        private void WorkerThreadStart(object userState)
        {
            object result = null;
            Exception workerException = null;
            bool cancel = false;
            try
            {
                DoWorkEventArgs workArgs = new DoWorkEventArgs(userState);
                this.OnDoWork(workArgs);
                if (workArgs.Cancel)
                {
                    cancel = true;
                }
                else
                {
                    result = workArgs.Result;
                }
            }
            catch (Exception ex)
            {
                workerException = ex;
            }
            RunWorkerCompletedEventArgs completedArgs = new RunWorkerCompletedEventArgs(result, workerException, cancel);
            if (isRunning)
            {
                this.asyncOperation.PostOperationCompleted(this.operationCompleted, completedArgs);
            }
        }


        // Properties
        public bool CancellationPending
        {
            get
            {
                return this.cancellationPending;
            }
        }

        public bool IsBusy
        {
            get
            {
                return this.isRunning;
            }
        }

        public bool WorkerReportsProgress
        {
            get
            {
                return this.workerReportsProgress;
            }
            set
            {
                this.workerReportsProgress = value;
            }
        }

        public bool WorkerSupportsCancellation
        {
            get
            {
                return this.canCancelWorker;
            }
            set
            {
                this.canCancelWorker = value;
            }
        }


        // Fields
        private AsyncOperation asyncOperation;
        private bool canCancelWorker;
        private bool cancellationPending;
        private static readonly object doWorkKey;
        private bool isRunning;
        private readonly SendOrPostCallback operationCompleted;
        private static readonly object progressChangedKey;
        private readonly SendOrPostCallback progressReporter;
        private static readonly object runWorkerCompletedKey;
        private readonly WorkerThreadStartDelegate threadStart;
        private bool workerReportsProgress;

        // Nested Types
        private delegate void WorkerThreadStartDelegate(object argument);

    }
}
Avatar billede jackass- Nybegynder
21. maj 2007 - 14:39 #19
Det spiller minus her.. Beklager :( Lukker spørgsmålet igen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester