У меня есть WinForm с backgroundWorker:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SeoTools.Utils;
namespace SeoTools.UI
{
public partial class UIProgress : Form
{
public UIProgress(DoWorkEventHandler doWorkEventHandler, RunWorkerCompletedEventHandler runWorkerCompletedEventHandler)
{
InitializeComponent();
this.backgroundWorker.WorkerReportsProgress = true;
this.backgroundWorker.WorkerSupportsCancellation = true;
this.backgroundWorker.DoWork += doWorkEventHandler;
this.backgroundWorker.RunWorkerCompleted += runWorkerCompletedEventHandler;
}
public void Start()
{
var foo = SynchronizationContext.Current;
backgroundWorker.RunWorkerAsync();
}
private void btnStop_Click(object sender, EventArgs e)
{
btnStop.Enabled = false;
btnStop.Text = "Stopping...";
backgroundWorker.CancelAsync();
}
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
try
{
wdgProgressBar.Value = e.ProgressPercentage;
if (this.Visible == false)
{
this.ShowDialog();
this.Update();
}
}
catch (InvalidOperationException) {}
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Hide(); //Here I get a InvalidOperationException
this.Dispose();
}
}
}
Первый раз запускаю, работает нормально. Но во второй раз я получаю InvalidOperationException
при вызове this.Hide()
.
«Дополнительная информация: недопустимая межпоточная операция: доступ к элементу управления UIProgress из потока, отличного от потока, в котором он был создан».
Странно то, что при первом запуске foo в Start() является WindowsFormsSyncronizationContext, но при второй попытке это System.Threading.SyncronizationContext.
Приложение, которое я пишу, представляет собой плагин ExcelDna.
РЕДАКТИРОВАТЬ
Start() вызывается так:
UIProgress uiProgress = new UIProgress(
delegate(object sender, DoWorkEventArgs args)
{
....
},
delegate(object sender, RunWorkerCompletedEventArgs args)
{
...
}
);
uiProgress.Start();
Start
? - person kennyzx   schedule 07.12.2014WindowsFormsSyncronizationContext
для последующего использования. Не знаю, как он переключается на другойSyncronizationContext
, хотя, может быть, это среда Excel-DNA ... требует некоторого времени на отладку. - person kennyzx   schedule 08.12.2014