2012-04-03 7 views

Antwort

1

du elegant mehr tun können, die BackgroundWorker Klasse.

XAML für den Button:

<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" }); 
     } 

    } 
+0

Dank für ausführliche Antwort zuzuteilen. Aber wie wird '** send.Image **' hier aufgerufen? – SHRI

+0

Sie können Argumente mit dem RunWorkerAsync() -Methodenaufruf übergeben. Ich habe die Probe aktualisiert, wie das geht. –

2

Machen Sie den Button zu einem Mitglied Ihrer Window/UserControl-Klasse (indem Sie ihm eine Name in XAML geben). Wenn schließlich der Faden endet, dies zu tun, bevor sie aus dem Thread-Methode zurückkehrt:

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