मैं काम करने के लिए कई BackgroundWorker
एस सेट करने की कोशिश कर रहा हूं और व्यस्त होने पर व्यस्त नहीं होने पर व्यस्त हूं। मैं उन्हें ठीक से काम नहीं कर पा रहा हूं। मेरे पास नीचे कोड है।सी # एकाधिक पृष्ठभूमिवर्कर्स
जब मैं FilesToProcess
MaxThreads
से बराबर या उससे कम सेट करता हूं तो यह पूरी तरह से काम करता है हालांकि अगर मैं इसे उच्च बना देता हूं, तो ऐप फ्रीज हो जाता है।
मुझे यकीन है कि यह कुछ आसान है, लेकिन मैं इसे देख नहीं सकता।
किसी भी मदद के लिए धन्यवाद :)
जे
using System;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;
namespace bgwtest
{
public partial class Form1 : Form
{
private const int MaxThreads = 20;
private const int FilesToProcess = 21;
private BackgroundWorker[] threadArray = new BackgroundWorker[MaxThreads];
public Form1()
{
InitializeComponent();
}
private void Form1Load(object sender, EventArgs e)
{
InitializeBackgoundWorkers();
}
private void InitializeBackgoundWorkers()
{
for (var f = 0; f < MaxThreads; f++)
{
threadArray[f] = new BackgroundWorker();
threadArray[f].DoWork += new DoWorkEventHandler(BackgroundWorkerFilesDoWork);
threadArray[f].RunWorkerCompleted += new RunWorkerCompletedEventHandler(BackgroundWorkerFilesRunWorkerCompleted);
threadArray[f].WorkerReportsProgress = true;
threadArray[f].WorkerSupportsCancellation = true;
}
}
private void button1_Click(object sender, EventArgs e)
{
for (var f = 0; f < FilesToProcess; f++)
{
var fileProcessed = false;
while (!fileProcessed)
{
for (var threadNum = 0; threadNum < MaxThreads; threadNum++)
{
if (!threadArray[threadNum].IsBusy)
{
Console.WriteLine("Starting Thread: {0}", threadNum);
threadArray[threadNum].RunWorkerAsync(f);
fileProcessed = true;
break;
}
}
if (!fileProcessed)
{
Thread.Sleep(50);
}
}
}
}
private void BackgroundWorkerFilesDoWork(object sender, DoWorkEventArgs e)
{
ProcessFile((int)e.Argument);
e.Result = (int)e.Argument;
}
private static void ProcessFile(int file)
{
Console.WriteLine("Processing File: {0}", file);
}
private void BackgroundWorkerFilesRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
}
Console.WriteLine("Processed File: {0}", (int)e.Result);
}
}
}
मुझे पता है तुम 'BackgroundWorker' के बारे में पूछ रहे हैं, लेकिन क्यों TPL या आरएक्स का उपयोग नहीं? वे इसे इतना आसान बना देंगे। – Enigmativity
आप यूआई थ्रेड पर सोने से डेडलॉक बना रहे हैं। RunWorker पूर्ण ईवेंट हैंडलर को चलने से रोकना। –