2012-04-03 58 views
1
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? 

    } 

我想將按鈕重置爲「發送」(完成線程後)。但表單不應該等待。這可能嗎?這不是等待的形式,但需要線程的完成通知

+0

哇,9小時。 請參閱此鏈接: http://stackoverflow.com/questions/2773479/how-to-check-if-thread-finished-execution – 2012-04-03 14:30:40

回答

1

您可以在此更優雅的使用BackgroundWorker類做。

XAML的按鈕:

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

代碼:

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

感謝配發了詳細的答覆。但是'** send.Image **'將如何在這裏被調用? – SHRI 2012-04-04 03:46:32

+0

您可以使用RunWorkerAsync()方法調用傳遞參數。我已經更新瞭如何做到這一點的示例。 – 2012-04-04 06:48:56

2

使Button成爲Window/UserControl類的成員(通過在XAML中給它一個Name)。當線程最終完成,做到這一點從線程方法返回前:

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