Я новичок как в c #, так и в многопоточности, и недавно я столкнулся с некоторыми препятствиями в инструменте, который пишу. Инструмент предназначен для генерации и запуска набора HttpWebRequests. Прямо сейчас он работает нормально однопоточным, но как только я начал распределять задачу между 3 или около того рабочими потоками, программа вылетает, давая мне следующее сообщение.
"vshost32-clr.exe перестал работать"
Мне интересно, связано ли это с тем, как я собираюсь создавать эти темы?
Вот фрагмент кода c #, который я использую. Будем весьма благодарны за любые рекомендации, чтобы сделать это немного менее дрянным.
private void CreateDocuments()
{
int docCount = 0;
ArrayList vsIDs = docRepo.GetVersionIDList();
ArrayList versionList = new ArrayList();
foreach (string vsID in vsIDs)
{
Document[] docs = docRepo.GetVersionSeries(vsID);
versionList.Add(docs);
if (versionList.Count == 3)
{
Console.WriteLine("Launch Thread");
Document[] docs1 = (Document[])versionList[0];
Document[] docs2 = (Document[])versionList[1];
Document[] docs3 = (Document[])versionList[2];
Worker w1 = new Worker(docs1);
Worker w2 = new Worker(docs2);
Worker w3 = new Worker(docs3);
Thread t1 = new Thread(new ThreadStart(w1.Start));
Thread t2 = new Thread(new ThreadStart(w2.Start));
Thread t3 = new Thread(new ThreadStart(w3.Start));
Console.WriteLine("Threads Started");
t1.Start();
t2.Start();
t3.Start();
//Wait until all threads have started
while (!t1.IsAlive || !t2.IsAlive || !t3.IsAlive) { Console.WriteLine("Waiting for Threads to Start"); }
Console.WriteLine("Wait on Threads");
t1.Join();
docCount += docs1.Length;
t2.Join();
docCount += docs2.Length;
t3.Join();
docCount += docs3.Length;
log.Info(docCount + " Documents Imported");
versionList.RemoveRange(0, 3);
}
}
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
public class Worker
{
ImportToolWebDAV itwd = new ImportToolWebDAV();
Document[] docs;
public Worker(Document[] _docs)
{
docs = _docs;
}
public void Start()
{
HttpStatusCode status = HttpStatusCode.OK;
foreach (Document doc in docs)
{
status = itwd.createDocument(doc);
}
Console.WriteLine("Thread finished");
}
}
Что он делает (или, по крайней мере, должен делать), выбирает массивы объектов «Документ» и запускает 3 потока для каждого набора из 3 массивов, а затем ждет, пока они завершат генерацию этих запросов PUT WebDAV. Это действительно грубый код, написанный только для тестирования многопоточности, но я предположил, что в этом состоянии все было в порядке.