Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Многопоточность


Автор: SCAR 4.1.2013, 23:25
Здравствуйте, у меня возникла проблема с выполнением процессов в отдельных потоках.
Необходимо передать объекты в поток, с целью провести определенные вычисления и изменить переданные объекты.
Создаю пул потоков и получаю исключение System.NotSupportedException на WaitHandler.WaitAll.

Код

public static void fillSubPathIntersections()
        {
            int i = 0;

            ManualResetEvent[] events = new ManualResetEvent[getFactorial(SegX.Instance.getPathListCount())];

            for(int k = 0; k < SegX.Instance.getPathListCount(); k++)
            {
                Path pth1 = SegX.Instance.getFromPathList(k);
                for(int p = k + 1; p < SegX.Instance.getPathListCount(); p++)
                {
                    Path pth2 = SegX.Instance.getFromPathList(p);

                    int cur = i;
                    events[cur] = new ManualResetEvent(false);
                    
                    ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object newDelegate) { findIntersectBtwnTwoSubs(ref pth1, ref pth2, ref events[cur]); }));
                    ++i;
                }
            }
            WaitHandle.WaitAll(events);
        }


private static void findIntersectBtwnTwoSubs(ref Path pth1,ref Path pth2, ref ManualResetEvent evnt)
        {
            lock (pth1)
            {
                lock (pth2)
                {
                    Dictionary<int, SubPathA> sub1 = pth1.getSubListA();
                    Dictionary<int, SubPathA> sub2 = pth2.getSubListA();

                    foreach (KeyValuePair<int, SubPathA> i in sub1)
                        foreach (KeyValuePair<int, SubPathA> j in sub2)
                        {
                            if (((SubPathA)(i.Value)).getSegmentSize != ((SubPathA)(j.Value)).getSegmentSize && ((SubPathA)(i.Value)).getDetLevel != ((SubPathA)(i.Value)).getDetLevel) continue;
                            findSubPathIntersection(i.Value, j.Value);
                        }
                }
            }
            evnt.Set();
        }



Подскажите пожалуйста, в чем ошибка и как ее исправить?

Автор: SCAR 6.1.2013, 21:40
Решил проблему при помощи класса Task:

Код

Task[] events = new Task[getFactorial(SegX.Instance.getPathListCount())];
            for(int k = 0; k < SegX.Instance.getPathListCount(); k++)
            {
                Path pth1 = SegX.Instance.getFromPathList(k);
                for(int p = k + 1; p < SegX.Instance.getPathListCount(); p++)
                {
                    Path pth2 = SegX.Instance.getFromPathList(p);

                    int cur = i;
                    events[cur] = Task.Factory.StartNew(() => findIntersectBtwnTwoSubs(ref pth1, ref pth2)); 
                                        
                    ++i;
                }
            }
            Task.WaitAll(events);


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)