11 Stimmen

Neuen Thread erstellen, Parameter übergeben

Ich möchte einen Thread erstellen und dann Parameter an ihn übergeben. Aber ich weiß nicht, wie.

Thread siteDownloader = new Thread(new ParameterizedThreadStart(GetHTML));

Dies ist eine Funktion, die ich als neues Thema eröffnen möchte.

static string GetHTML(string siteURL)
{
    WebClient webClient = new WebClient();

    try
    {
        string sitePrefix = siteURL.Substring(0, 7);
        if (sitePrefix != "http://")
        {
            siteURL = "http://" + siteURL;
        }
    }
    catch
    {
        siteURL = "http://" + siteURL;
    }

    try
    {
        return webClient.DownloadString(siteURL);
    }
    catch
    {
        return "404";
    }
}

22voto

Marc Gravell Punkte 970173

Ich persönlich verwende immer erfasste Variablen, d. h.

int a = ...
string b = ...
ThreadStart work = delegate {
    var result = DoSomethingInteresting(a, b);
    // push result somewhere; might involve a UI
    // thread switch
};
new Thread(work).Start();

Das bedeutet, dass sie im Gegensatz zur Übergabe eines Objektparameters während der Erstellung immer auf Korrektheit geprüft wird.

12voto

Rafal Spacjer Punkte 4718

Unter Berufung auf die msdn :

public class Work
{
    public static void Main()
    {
        // To start a thread using a shared thread procedure, use
        // the class name and method name when you create the 
        // ParameterizedThreadStart delegate. C# infers the 
        // appropriate delegate creation syntax:
        //    new ParameterizedThreadStart(Work.DoWork)
        //
        Thread newThread = new Thread(Work.DoWork);

        // Use the overload of the Start method that has a
        // parameter of type Object. You can create an object that
        // contains several pieces of data, or you can pass any 
        // reference type or value type. The following code passes
        // the integer value 42.
        //
        newThread.Start(42);

        // To start a thread using an instance method for the thread 
        // procedure, use the instance variable and method name when 
        // you create the ParameterizedThreadStart delegate. C# infers 
        // the appropriate delegate creation syntax:
        //    new ParameterizedThreadStart(w.DoMoreWork)
        //
        Work w = new Work();
        newThread = new Thread(w.DoMoreWork);

        // Pass an object containing data for the thread.
        //
        newThread.Start("The answer.");
    }

    public static void DoWork(object data)
    {
        Console.WriteLine("Static thread procedure. Data='{0}'",
            data);
    }

    public void DoMoreWork(object data)
    {
        Console.WriteLine("Instance thread procedure. Data='{0}'",
            data);
    }
}

Wie Sie sehen können, erstellen Sie eine Methode mit einer object als Parameter und übergeben diesen Parameter an die Start Methode der Thread Klasse

3voto

cadrell0 Punkte 16771

Die Lösung von Rafal wird funktionieren, aber ich bin mir nicht sicher, wie Sie Ihren Rückgabewert daraus erhalten. Wie Martinho anmerkt, erfordert ParameterizedThreadStart eine ungültige Rückgabe der Methode. Versuchen Sie stattdessen einen BackgroundWorker zu verwenden.

Sagen wir es so.

var bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync(url);

Hier ist DoWork, im Grunde eine modifizierte Version von GetHTML.

static void bw_DoWork(object sender, DoWorkEventArgs e)
{
    WebClient webClient = new WebClient();
    string siteURL = (string)e.Argument;

    try
    {
        string sitePrefix = siteURL.Substring(0, 7);
        if(sitePrefix != "http://")
            siteURL = "http://" + siteURL;
    }
    catch
    {
        siteURL = "http://" + siteURL;
    }

    try
    {
        e.Result = webClient.DownloadString(siteURL);
    }
    catch
    {
        e.Result = "404";
    }
}

Führen Sie schließlich in bw_RunWorkerCompleted etwas wie folgt aus

static void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    string result;
    result = (string)e.Result;
    //do something with result
}

1voto

R. Martinho Fernandes Punkte 217895

Haben Sie sich die Dokumente für ParametrizedThreadStart ? Sie brauchen eine Methode, die einen Objektparameter annimmt und nichts zurückgibt. Sie müssen also die Signatur Ihrer Methode entsprechend ändern:

static void GetHTML(object data)
{
    string siteUrl = (string) data; // cast argument to string
    // blah blah
}

Und dann müssen Sie sich überlegen, wie Sie den Rückgabewert verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X