Announcement

Collapse
No announcement yet.

Rückgabewerte bei Threads

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Rückgabewerte bei Threads

    Hallo,

    Ich will in meiner Software erreichen, dass Requests jeweils in einem eigenen Thread abgearbeitet werden.
    Ich "stecke" dazu die entsprechenden Threads in einen ThreadPool.

    Jetzt habe ich eine Frage, wie man in C# eine Funktion mit Rückgabewert asynchron über einen ThreadPool aufrufen kann. Oder ist das gar nicht möglich und man muss den Rückgabewert irgendwo anders hinschreiben, z.B. in irgendein Dictionary?

    mfg Johann

  • #2
    Hallo,

    der einfachste Weg, um Programmcode in einem separaten Arbeits-Thread ausführen zu lassen, besteht im asynchronen Aufruf einer Delegate-Methode über <b>BeginInvoke</b>. Die beim Aufruf von BeginInvoke übergebene Delegate-Methode wird in einem Thread aus dem System-Threadpool ausgeführt. Die Methode BeginInvoke liefert einen <b>IAsyncResult</b>-Rückgabewert zurück, so dass eine Auswertung des Ergebnisses über die Methode <b>EndInvoke</b> möglich wird.

    Im Fall eines Web Service würde das in C# etwa so aussehen, dort baut VS.NET im Hintergrund eine Hilfsklasse zusammen, die das Ganze für uns einfach nutzen lässt:

    <pre>

    private void LogAction(string sAction)
    {
    string sTxt;
    sTxt = string.Format("{0}: {1}", System.Environment.TickCount.ToString(), sAction);
    ListBox1.Items.Add(sTxt);
    }

    private void Button1_Click(object sender, System.EventArgs e)
    {
    ListBox1.Items.Add("Synchroner Aufruf:");
    localhost.ServiceAsync aWS = new localhost.ServiceAsync();
    LogAction("Instanz vom Web Service angefordert");
    string sTxt;
    LogAction("Methode OSCreditCardCheck wird aufgerufen...");
    sTxt = aWS.OSCreditCardCheck(textBox1.Text);
    LogAction("...Methodeaufruf OSCreditCardCheck fertig.");
    LogAction("Ergebnis: " + sTxt);
    }

    private void OSCreditCardCheckCallback(IAsyncResult iAR)
    {
    string sTxt = ((localhost.ServiceAsync)iAR.AsyncState).EndOSCred itCardCheck(iAR);
    LogAction("Ergebnis: " + sTxt);
    }

    private void Button2_Click(object sender, System.EventArgs e)
    {
    ListBox1.Items.Add("-------------------");
    ListBox1.Items.Add("Assynchroner Aufruf:");
    LogAction("Instanz wird vom Web Service angefordert");
    localhost.ServiceAsync aWS = new localhost.ServiceAsync();
    IAsyncResult iAR;
    LogAction("Methode BeginOSCreditCardCheck wird aufgerufen...");
    iAR = aWS.BeginOSCreditCardCheck(textBox1.Text, new System.AsyncCallback(OSCreditCardCheckCallback), aWS);
    LogAction("...Methodeaufruf BeginOSCreditCardCheck fertig.");
    StatusBar1.Text = "Fertig.";
    }

    </pre&gt

    Comment

    Working...
    X