Ich brauche etwas Hilfe mit BackgroundWorker. Mit Visual Studio 2015 und seine Windows-FormulareTextBox nicht in Echtzeit aktualisiert über BackgroundWorker mit DataReceivedEventHandler aktiviert
Ich bin neu in dieser Art von Dingen und habe wirklich keine Ahnung, wie es funktioniert usw. Der Code, den ich bisher auf verschiedene Beiträge hier basiert basiert.
worker_DoWork_ wird überhaupt nicht gefeuert, aber keine Ahnung warum. Ich glaube, das hat etwas mit DataRceivedEventHandler zu tun, denn wenn ich das verschiebe, verschiebe ich den worker.DoWork + = worker_DoWork_; und worker.RunWorkerAsync(); In Button geklickt Ereignis und deaktivieren Sie DataReceivedEventHandler, Methode Worker_DoWork_ gefeuert und ich kann TextBox mit jedem statischen Text unter DoSomeWork zugewiesen aktualisieren.
Auch habe ich keine Ahnung, wie Sie über DoSomeWork Umriss Daten in das Textfeld übergeben.
Kann jemand bitte aushelfen.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;
namespace CMD_testing
{
public partial class Form1 : Form
{
BackgroundWorker worker;
private delegate void DELEGATE();
public Form1()
{
InitializeComponent();
worker = new BackgroundWorker();
}
private void button2_Click(object sender, EventArgs e)
{
Process process;
process = new Process();
process.StartInfo.FileName = @"C:\\Project\Test\Data.bat";
process.StartInfo.UseShellExecute = false;
// process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardOutput = true;
process.OutputDataReceived += new DataReceivedEventHandler(OutputHandler);
process.StartInfo.RedirectStandardInput = true;
process.Start();
process.BeginOutputReadLine();
// process.WaitForExit();
// process.Close();
}
private void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
{
if (outLine.Data != null)
{
Console.WriteLine("Im here...");
worker.DoWork += worker_DoWork_;
//worker.RunWorkerAsync();
Console.WriteLine("Im here NOW");
Console.WriteLine(outLine.Data); //its outputed fine into the console
}
}
private void worker_DoWork_(object sender, DoWorkEventArgs e)
{
Console.WriteLine("I'm at worker_DoWork_");
Delegate del = new DELEGATE(DoSomeWork);
this.Invoke(del);
}
private void DoSomeWork()
{
Thread.Sleep(1000);
textBox1.Text = "????"; // how to pass outline.Data in here
}
}
}
warum haben Sie kommentiert //worker.RunWorkerAsync(); ??? – NicoRiff
weil ich einen Ausnahmefehler bekomme, der besagt, dass Backgroundworker bereits läuft und nicht gleichzeitig ausgeführt werden kann. Daher glaube ich, dass DataReceivedHandler eine von denen tritt, aber ich könnte falsch liegen –
Sie müssen diese Zeile auskommentieren. Wenn du versuchst, es ein zweites Mal auszuführen, wird es zum Absturz kommen. Überprüfen Sie zunächst, ob (! Worker.IsBusy) {worker.RunWorkerAsync(); } - das erlaubt es nur zu laufen, wenn es gerade nicht läuft. –