2 Stimmen

es handelt sich nicht um ein Warteformular, sondern die Meldung des Abschlusses eines Threads ist erforderlich

  private void  btnSend_Click(object sender, RoutedEventArgs e)
    {

    Button obj=(Button)sender;
    obj.Content="Cancel";

    SendImage send = new SendImage();
    Thread t = new Thread(send.Image);
    t.Start();
                            //run separate thread.(very long, 9 hours)
                            //so dont wait.

    //but the button should be reset to obj.Content="Send"
    //Can I do this?

    }

Ich möchte, dass die Schaltfläche auf "Senden" zurückgesetzt wird (nach Abschluss des Threads). Aber das Formular soll nicht warten. Ist dies möglich?

2voto

Clemens Punkte 118983

Machen Sie die Schaltfläche zu einem Mitglied Ihrer Window/UserControl-Klasse (indem Sie ihr eine Name in XAML). Wenn der Thread schließlich beendet wird, tun Sie dies, bevor Sie aus der Thread-Methode zurückkehren:

myButton.Dispatcher.BeginInvoke(
    (Action)(() => myButton.Content = "Send"));

2voto

Magnus Johansson Punkte 27363

Eleganter geht es mit der Funktion BackgroundWorker Klasse.

XAML für die Schaltfläche:

   <Button x:Name="btnGo" Content="Send" Click="btnGo_Click"></Button>

Code:

 private BackgroundWorker _worker;

    public MainWindow()
    {
      InitializeComponent();
      _worker = new BackgroundWorker();
      _worker.WorkerSupportsCancellation = true;
      _worker.WorkerReportsProgress = true;
    }

    private void btnGo_Click(object sender, RoutedEventArgs e)
    {
      _worker.RunWorkerCompleted += delegate(object completedSender, RunWorkerCompletedEventArgs completedArgs)
      {
        Dispatcher.BeginInvoke((Action)(() =>
        {
          btnGo.Content = "Send";
        }));
      };

      _worker.DoWork += delegate(object s, DoWorkEventArgs args)
      {
        Dispatcher.BeginInvoke((Action)(() =>
        {
          btnGo.Content = "Cancel";
        }));

        SendImage sendImage = args.Argument as SendImage;
        if (sendImage == null) return;

        var count = 0;
        while (!_worker.CancellationPending)
        {
          Dispatcher.BeginInvoke((Action)(() =>
          {
            btnGo.Content = string.Format("Cancel {0} {1}", sendImage.Name, count);
          }));
          Thread.Sleep(100);
          count++;
        }
      };

      if (_worker.IsBusy)
      {
        _worker.CancelAsync();
      }
      else
      {
        _worker.RunWorkerAsync(new SendImage() { Name = "Test" });
      }

    }

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