Ich habe eine WinForm mit einem Background:Background: InvalidOperationException in RunWorkerCompleted
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();
}
}
}
erste Mal, dass ich laufen diese es funktioniert gut. Aber das zweite Mal bekomme ich InvalidOperationException
beim Aufruf this.Hide()
.
"Weitere Informationen: Cross-Thread-Operation nicht gültig: Steuern Sie 'UIProgress' von einem anderen Thread als dem Thread, auf dem es erstellt wurde."
Das Seltsame ist auf ersten Lauf foo in Start() ist ein WindowsFormsSyncronizationContext aber auf dem zweiten Versuch, es ist ein System.Threading.SyncronizationContext.
Die Anwendung, die ich schreibe, ist ein ExcelDna-Plugin.
UIProgress uiProgress = new UIProgress(
delegate(object sender, DoWorkEventArgs args)
{
....
},
delegate(object sender, RunWorkerCompletedEventArgs args)
{
...
}
);
uiProgress.Start();
Wie 'Start' aufgerufen wird? – kennyzx
@kennyzx Ich habe meine Frage –
aktualisiert Ich habe eine alte [Beitrag] (http://blogs.msdn.com/b/mattdotson/archive/2006/02/13/531315.aspx) auf SyncronizationContext, die Technik gefunden , können Sie den 'WindowsFormsSyncronizationContext' zur späteren Verwendung speichern. Ich weiß nicht, wie es zu einem anderen "SyncronizationContext" geschaltet wird, aber vielleicht ist die Excel-DNA-Umgebung ... etwas harte Debugging-Zeit. – kennyzx