J'ai besoin d'aide avec BackgroundWorker. Utilisation de Visual Studio 2015 et ses formulaires WindowsTextBox non mis à jour en temps réel via BackgroundWorker avec DataReceivedEventHandler activé
Je suis nouveau à ce genre de choses et je n'ai vraiment aucune idée de comment cela fonctionne, etc. Le code que j'ai jusqu'ici est basé sur divers messages ici.
worker_DoWork_ ne pas être déclenché du tout, mais aucune idée pourquoi. Je crois que c'est quelque chose à voir avec DataRceivedEventHandler parce que quand je déplace le If je déplace le worker.DoWork + = worker_DoWork_; et worker.RunWorkerAsync(); en événement cliqué sur un bouton et désactiver DataReceivedEventHandler, la méthode worker_DoWork_ est déclenchée et je peux mettre à jour textBox avec n'importe quel texte statique affecté sous DoSomeWork.
Aussi, je ne sais pas comment passer des données de plan dans la zone de texte via DoSomeWork.
Quelqu'un peut-il vous aider s'il vous plaît.
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
}
}
}
pourquoi avez-vous commenté //worker.RunWorkerAsync(); ??? – NicoRiff
car j'obtiens une erreur d'exception indiquant que Backgroundworker est déjà en cours d'exécution et ne peut pas s'exécuter en même temps. Par conséquent, je crois que DataReceivedHandler donne un coup de pied à l'un d'entre eux, mais je peux me tromper. –
Vous devez décommenter cette ligne. Si vous essayez de l'exécuter une seconde fois, c'est à ce moment-là qu'il va planter. Donc d'abord, vérifiez si (! Worker.IsBusy) {worker.RunWorkerAsync(); } - Cela ne lui permettra que de s'exécuter s'il n'est pas en cours d'exécution. –