Asynchrone Programmierung, Callbacks

Kruemel90

Grünschnabel
Hallo miteinander,

ich bin neu hier im Forum und noch Anfänger was C# betrifft, habe allerdings schon Erfahrung mit anderen Programmiersprachen.

Ich würde gerne als kleine Herausforderung eine Komponente schreiben, die einen einfachen Zugang zu Sockets erlaubt. Dabei soll die Komponente sowohl als Server oder Client agieren können und die Möglichkeit bieten über ein Protokoll, Text, Anweisungen und Daten schicken zu können.

Meine Frage ist aber eher generell: Was ist das beste Vorgehen für die asynchronen Methoden aufrufe?
Die eigentliche Methode, die Daten empfängt, soll asynchron ablaufen.

Realisieren würde ich das mit einem Delegaten und BeginInvoke oder durch das erstellen eines neuen Threads und starten der Einstiegsmethode - sollte ja eigentlich auf das selbe hinauslaufen, oder?

Wie wären jetzt die Callbacks zu gestalten? Ich dachte an Event-Delegates die die Download-Komponente (in ihr ist die asynchrone Methode definiert) aufruft. Diese Aufrufe würde ja aber nun im "Worker-Thread" stattfinden. Um GUI-Änderungen vornehmen zu können müsste in diesen Event-Handler mit control.Invoke gearbeitet werden. Das möchte ich eigentlich vermeiden und die Komponente selbst threadsicher machen.

Was ist in so einem all best-practice? Wie würdet ihr sowas machen?

Gruß, Kruemel

Mal noch ein bisschen Code dazu:


Code:
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        Downloader dl;
        private delegate void startDL();
        private startDL startDownload;

        public Form1()
        {
            InitializeComponent();
            dl = new Downloader(this);
            dl.OnStart += start_Handler;
            dl.OnProgress += start_Handler;
            dl.OnComplete += start_Handler;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            startDownload = dl.load;
            startDownload.BeginInvoke(null, null);            
        }

        private void start_Handler(object sender, MyArgs e)
        {
            textBox1.AppendText("Event");
        }
    }

    class Downloader
    {
        Control parent;

        public event EventHandler<MyArgs> OnStart;
        public event EventHandler<MyArgs> OnProgress;
        public event EventHandler<MyArgs> OnComplete;

        public Downloader(Control parent)
        {
            this.parent = parent;
        }

        public void load()
        {
            EventHandler<MyArgs> handler = OnStart;
            if(OnStart!=null)                
                parent.Invoke(handler, new Object[]{this, new MyArgs()});
            else
                MessageBox.Show("Start Is Null");
            Thread.Sleep(2000);

            handler = OnProgress;
            if (OnProgress != null)
                parent.Invoke(handler, new Object[] { this, new MyArgs() });
            else
                MessageBox.Show("Progress Is Null");
            Thread.Sleep(2000);


            handler = OnComplete;
            if (OnComplete != null)
                parent.Invoke(handler, new Object[] { this, new MyArgs() });
            else
                MessageBox.Show("Complete Is Null");
        }

    }

    class MyArgs:EventArgs{

    }
}
 
Zurück