RunWorkerCompleted стрельба слишком быстро - PullRequest
1 голос
/ 19 января 2012

Я получил действительно простой код, но не могу заставить его работать. Я использую BackgroundWorker. Проблема в том, что RunWorkerCompleted запущен быстро. Сразу после запуска я получаю сообщение «Работа завершена», но приложение остается замороженным в течение нескольких секунд, так как «DataType data = new DataType (path);» Бигн казнен. После этого я правильно заполнил все свои DataGridViews и т.д. Если я поменяю эту единственную строку с Thread.Sleep, все, кажется, будет работать хорошо. Есть идеи?

    public frmWindow(string path)
    {
       InitializeComponent();
       DataType d;
       backgroundWorker1.RunWorkerAsync(path);
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
       string path = e.Argument as string;
       DataType data = new DataType(path);
       e.Result = data;            
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
       d = e.Result as DataType;
       MessageBox.Show("Work completed");
    }

1 Ответ

1 голос
/ 19 января 2012

Как насчет того, чтобы вы использовали Debug.Write вместо MessageBox.Show с таймерами, чтобы показать, когда методы вводятся и выходят.

Хотя этот же фоновый поток может воздействовать на ваш пользовательский интерфейс, это почти всегда НЕ полезно - пользовательский интерфейс не безопасен для потоков.

BackgroundWorker backGroundWorker1;
        public frmWindow(string path)
        {
            InitializeComponent();
            DataType d;

            backGroundWorker1 = new BackgroundWorker();

            backGroundWorker1.DoWork += (s, e) =>
            {
                System.Diagnostics.Debug.Write("Work started at: " + DateTime.Now + Environment.NewLine);
                string path = e.Argument as string;
                DataType data = new DataType(path);
                e.Result = data;
            };

            backGroundWorker1.RunWorkerCompleted += (s, e) =>
            {
                d = e.Result as DataType;
                System.Diagnostics.Debug.Write("Work completed at: " + DateTime.Now + Environment.NewLine);
            };

            backGroundWorker1.RunWorkerAsync();

        }
...