2013-04-12 4 views
0

Я написал нестатический класс.Разрыв параллельных потоков

В этом классе существует нестатический метод, который вызывает статический метод того же класса. В этом статическом методе в анонимных методах (или лямбда-выражениях) запускаются 2 или более разных потока, которые выполняют некоторую работу на очень большом массиве независимо.

Это прекрасно работает! Отличная производительность, никаких проблем .....

Но ... существует также общедоступное статическое свойство, защищенное объектом статической блокировки ..., которое я не использую для каких-либо других целей, кроме как для блокировки этого статическое свойство.

Все вместе выглядит как-то так:

public class testClass 
{ 
    private volatile static bool cancelProcessing; 
    private static readonly object lockObj = new object(); 

    public static bool CancelProcessing 
    { 
     get 
     { 
      lock (lockObj) 
      {return cancelProcessing;} 
     } 
     set 
     { 
      lock (lockObj) 
      {cancelProcessing = value;} 
     } 
    } 

    public void callingMethod() 
    { 
     staticThreadsMethods(); 
    } 

    private static void staticThreadsMethods() 
    { 
     int parts = 4; // array parts 
     CountdownEvent _countdown = new CountdownEvent(parts); 
     for (int u = 0; u < parts; u++) 
      { 
       Threads[u] = delegate(object counter) 
       { 
        // array gets processed 
        _countdown.Signal(); 
       }; 
     } 

     _countdown.Wait(); 
    } 
} 

после вызова callingMethod(), 2 или 4 например, или более потоков запускаются в то же время, как анонимные делегаты (или лямбда-выражения) в staticThreadsMethods() ...

Теперь, что я действительно не могу понять следующее:

Меняется I значения свойства CancelProcessing из другого потока, в то время как все нити работают параллельно , хотя это свойство не используется в потоках (оно должно было использоваться для отмены потоков, но у меня всегда были одни и те же ошибки/исключения), я получаю исключение System.AccessViolationException, потому что небезопасный указатель на массив не может быть разыменован. Указатель недействителен больше (??), когда я просто изменяю значение свойства, но не делаю ничего другого. Почему?

+1

Возможно, вам стоит взглянуть на то, что http://msmvps.com/blogs/jon_skeet/archive/2010/08/29/writing-the-perfect-question.aspx – didierc

+2

конец вашего вопроса, в частности, трудно следовать: вы должны начать с правильного изложения всех фактов, а затем задать свои вопросы, указав при необходимости соответствующие факты. – didierc

+0

Да, вы правы .... Я буду рассматривать ваши комментарии в следующий раз :) – BlueAutumn

ответ

1

Если вы используете .NET 4 и выше, я рекомендую использовать Tasks вместо потоков для обработки обработанного массива вычислений. Используйте CancellationTokenSource для отмены. Об исключении, вероятно, это связано с обработкой массива, а не с bool или блокировкой. Вам нужно больше узнать о обработке массивов.

+0

Спасибо за ваш ответ (!!!) - Я знаю о задачах и CancellationTokenSource, но я хотел сделать это именно так, сначала убедитесь, что мой код работает до сих пор ... и чтобы он стал проще ... может быть, и написать его для Linux ... Но вы абсолютно правы! Ссылка на массив получает 'null', когда я отменяю свой поток, потому что форма, которая взаимодействует с классом, закрывается, поэтому я получаю это исключение !! - Большое вам спасибо, вы спасли мой день! :) – BlueAutumn

Смежные вопросы