это не ожидающая форма, но требуется уведомление о завершении потока - PullRequest
1 голос
/ 03 апреля 2012
  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?

    }

Я хочу, чтобы кнопка была сброшена на «Отправить» (после завершения потока).Но форма не должна ждать.Возможно ли это?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

Сделайте Button членом вашего класса Window / UserControl (присвоив ей Name в XAML).Когда поток в конце концов завершится, сделайте это прежде, чем вернуться из метода потока:

myButton.Dispatcher.BeginInvoke(
    (Action)(() => myButton.Content = "Send"));
1 голос
/ 03 апреля 2012

Вы можете сделать это более элегантно, используя 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" });
      }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...