Update C# - Diagramm mithilfe der BackgroundWorker-Klasse
Ich bin derzeit versucht, zu aktualisieren ein Diagramm, das auf meinem Formular in den hintergrund Arbeiter mit:
bwCharter.RunWorkerAsync(chart1);
Läuft:
private void bcCharter_DoWork(object sender, DoWorkEventArgs e)
{
System.Windows.Forms.DataVisualization.Charting.Chart chart = null;
//Convert e.Argument to chart
//..
//Converted..
chart.Series.Clear();
e.Result=chart;
setChart(c.chart);
}
private void setChart(System.Windows.Forms.DataVisualization.Charting.Chart arg)
{
if (chart1.InvokeRequired)
{
chart1.Invoke(new MethodInvoker(delegate { setChart(arg); }));
return;
}
chart1 = arg;
}
Jedoch an dem Punkt des Löschens der Serie, wird eine Ausnahme geworfen.
Im Grunde, ich will nicht eine ganze Menge mehr Verarbeitung nach der Befreiung von der Serie, die verlangsamt die GUI komplett ab - so wollte das in einem anderen thread.
Dachte ich, dass durch die übergabe als argument, wie ich sein sollte sicher, aber anscheinend nicht!
Interessant, das Diagramm ist auf einer Registerkarte. Ich kann laufen, diese über und über, wenn die tabpage in den hintergrund, aber wenn ich diesen starte, schauen Sie auf den chart, verstecken Sie es wieder, und erneut ausführen, es wirft die Ausnahme. Natürlich wirft es, wenn sich das Diagramm in den Vordergrund als gut.
Kann jeder jeden schlagen, was ich anders machen kann?
Dank!
BEARBEITEN:
Ich weiß, dass dies getan werden kann in der form thread, als wenn ich aufgebe, es wieder zurück. Aber der springende Punkt, der mit einem hintergrund-Arbeiter ist zu vermeiden, zu Schleifen, das ganze Programm halt. Wie ich schon sagte, es ist viel mehr die Verarbeitung, als nur diesen einen Befehl.
Bin ich davon ausgegangen, dass die übergabe als argument, das mir erlauben würde, es in diesem thread ungehindert, aber gibt es eine chance, dass diese weitergegeben chart noch Punkte zurück zu der ursprünglichen Grafik in irgendeiner Weise? Wenn ja, wie können diese überwunden werden?
Ich soll das blockieren der GUI-thread so wenig wie möglich - so scheint es keinen Punkt in die aufrufen jeden Befehl.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, deaktivieren Sie es zuerst, dann werden eine Menge tun, asynchron zu arbeiten, bevor Sie es wieder einzublenden, warum rufst du nicht
chart.Series.Clear();
vor, Sie rufen dieBackgroundWorker
? In diesem Fall wird er gelöscht auf der main-UI-thread, dann führen Sie som async arbeiten, bevor Sie wieder das Diagramm aus dem UI-thread.Auch, wenn mit einem
BackgroundWorker
, würde ich die eingebauteReportProgress
und WorkerCompleted Ereignisse zu vermeiden, die manuelle cross-thread aufrufen. Das ist Teil der Grund für die Verwendung derBackgroundWorker
in der erste Ort, um diese Art von Funktionalität für "frei". Also das Diagramm sollte in der WorkerCompleted um Ihren code zu vereinfachen (auch wenn das nicht die Ursache des Problems in diesem Fall).Check für Invoke Erforderlich bcCharter_DoWork, wenn ja setzen Sie die Clear-Methode aufrufen, in der ein Delegierter zu.
Stimme ich mit der Analyse in den vorherigen posts : Sie bitten einen thread, um Zugriff auf eine Ressource von einem anderen thread.
Wie Sie eine BackgroundWorker-ich schlage vor, Sie verwenden die Dispatcher :
Das problem Auftritt, ist, dass Sie keinen Zugriff auf UI-Elemente auf threads anderer als der, den Sie erstellt wurden. Allerdings, in Ihrem Fall können Sie einfach deaktivieren Sie das Diagramm vor dem Aufruf der hintergrund-Arbeiter.
Können Sie manuell Marschall UI-element-Zugriff auf den richtigen thread aus einem anderen thread mit
Control.Invoke
.