c # Многопоточность Проблема / vshost32-clr.exe перестал работать - PullRequest
1 голос
/ 12 сентября 2011

Я новичок как в 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. Это действительно грубый код, написанный только для тестирования многопоточности, но я предположил, что в этом состоянии все было в порядке.

1 Ответ

0 голосов
/ 14 сентября 2011

Вы можете проверить эту ссылку, если у вас есть машина dell, поскольку «vshost32-clr.exe перестал работать»

http://social.msdn.microsoft.com/Forums/en-NZ/vbide/thread/308a2e5b-f486-4eb6-9276-5cc816665b86

Далее AppInit_dlls

Надеюсь, это поможет ...

~ бхупендра

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...