Обновление метки данными из потока - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь обновить метку в окнах форм.Действие происходит в отдельном классе, но пока действие происходит в отдельном классе.Ярлык должен быть обновлен, но, похоже, что-то не работает.Пожалуйста, помогите

Ниже приведен код Back формы ProcessingUI

public partial class ProcessingUI : Form
{
    private void start_Click(object sender, EventArgs e)
    {
        StartProcessingTask();
    }

     private void StartProcessingTask()
    {
        if (_isRunning)
            return;

        _isRunning = true;

        _taskToken = new CancellationTokenSource();

            Task.Factory.StartNew(() =>
            {
                while (_isRunning)
                {

                    var data = _processing.Processdata(lblCounter, _taskToken);
                    if (data.Success)
                        _isRunning = false;
                    if (_taskToken.IsCancellationRequested)
                        return;
                }

            });

    }

    public delegate void SetStatusCallback();
    public void UpdateStatus()
    {
       lblCounter.Invoke((Action)delegate
        {

            lblCounter.Text += new EventHandler(_processing.Raise);
        });
    }
}

Затем приведен отдельный класс, который выполняет действие, в основном его просто обновление.Теперь при обновлении я просто хочу передать обновляемую запись.Поэтому я вызываю метод из формы и использую его в этом классе.

 public class Processing
    {
         public Results Processdata(CancellationTokenSource taskToken)
        {
        foreach (var record in dataCases)
                {
           //Doing other things here like updating
             new ProcessingUI().UpdateStatus();//This is the method I am calling from the form.
             get(record.RequestReference);
            }

        }

         public string get(string msg)
                 {
                 return msg;
               } 
          public void Raise(object sender, EventArgs e)
              {
                 get("hello");

                 }

    }

1 Ответ

0 голосов
/ 13 июня 2018

Использование Progress для обработки многопоточного доступа

public class Processing
{
    public Results ProcessData(IProgress<string> statusReporter, CancellationToken cancellationToken)
    {
        foreach (var record in dataCases)
        {
            // Doing other things here like updating

            // Update the status:
            statusReporter.OnReport(record.RequestReference);

            // Stop if the task has been cancelled:
            cancellationToken.ThrowIfCancellationRequested();
        }
    }
}

public partial class ProcessingUI : Form
{
    private void start_Click(object sender, EventArgs e)
    {
        StartProcessingTask();
    }

    private void StartProcessingTask()
    {
        if (_isRunning)
            return;

        _isRunning = true;
        _taskToken = new CancellationTokenSource();

        CancellationToken cancellationToken = _taskToken.Token;
        IProgress<string> statusReporter = new Progress<string>(UpdateStatus);

        Task.Run(() =>
        {
            while (_isRunning)
            {
                var data = _processing.ProcessData(lblCounter, cancellationToken);
                if (data.Success)
                {
                    _isRunning = false;
                }
                else
                {
                    cancellationToken.ThrowIfCancellationRequested();
                }
            }
        });
    }

    private void UpdateStatus(string message)
    {
        lblCounter.Text = message;    
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...