Frage

Ich versuche, einen Thread zu erzeugen, um sich um die Dowork -Aufgabe zu kümmern, die weniger als 3 Sekunden dauern sollte. In Dowork dauert es 15 Sekunden. Ich möchte Dowork abbrechen und die Steuerung wieder in den Hauptfaden übertragen. Ich habe den Code wie folgt kopiert und es funktioniert nicht. Anstatt Dowork abzubrechen, beendet es Dowork immer noch und überträgt dann die Steuerung wieder an den Hauptfaden. Was mache ich falsch?

class Class1
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    /// 

    private static System.Threading.ManualResetEvent[] resetEvents;

    [STAThread]
    static void Main(string[] args)
    {
        resetEvents = new ManualResetEvent[1];

        int i = 0;

        resetEvents[i] = new ManualResetEvent(false);
        ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork),(object)i);


        Thread.CurrentThread.Name = "main thread";

        Console.WriteLine("[{0}] waiting in the main method", Thread.CurrentThread.Name);

        DateTime start = DateTime.Now;
        DateTime end ;
        TimeSpan span = DateTime.Now.Subtract(start);


        //abort dowork method if it takes more than 3 seconds
        //and transfer control to the main thread.
        do
        {
            if (span.Seconds < 3)
                WaitHandle.WaitAll(resetEvents);
            else
                resetEvents[0].Set();


            end = DateTime.Now;
            span = end.Subtract(start);
        }while (span.Seconds < 2);



        Console.WriteLine(span.Seconds);


        Console.WriteLine("[{0}] all done in the main method",Thread.CurrentThread.Name);

        Console.ReadLine();
    }

    static void DoWork(object o)
    {
        int index = (int)o;

        Thread.CurrentThread.Name = "do work thread";

        //simulate heavy duty work.
        Thread.Sleep(15000);

        //work is done..
        resetEvents[index].Set();

        Console.WriteLine("[{0}] do work finished",Thread.CurrentThread.Name);
    }
}
War es hilfreich?

Lösung

Alle gepoolte Fäden sind Hintergrund -Threads, was bedeutet, dass sie automatisch enden, wenn der Vordergrund der Anwendung endet.

Ich habe Ihre Schleife geändert und die Wiederherstellungen entfernt.

     //abort dowork method if it takes more than 3 seconds 
     //and transfer control to the main thread. 
     bool keepwaiting = true;
     while (keepwaiting)
     {
        if (span.Seconds > 3)
        {
           keepwaiting = false;
        }

        end = DateTime.Now;
        span = end.Subtract(start);
     }

Andere Tipps

[STAThread] ist eine einzelne Fadenwohnung. Versuchen [MTAThread] Das ist Multi -Thread -Wohnung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top