2016-11-30 3 views
0

Я разрабатываю приложение, использующее многопоточность.thread is dead priority нельзя получить доступ

У меня есть поток, который производит некоторые данные каждые 200 мс (данные вибрации с устройства сбора данных). И каждый раз, когда я возвращаю данные, я запускаю несколько задач для работы. На моем компьютере разработки нет ошибки. Но когда я развертываю проект на менее мощном планшете, у меня появляется следующее сообщение, появляющееся несколько раз:

нить мертва. невозможно получить доступ к приоритету.

Вот мой код:

private void myCallback1Axis(IAsyncResult ar) 
     { 
      GC.Collect(); 
      try 
      { 
       if (runningTask == ar.AsyncState) 
       { 
        data = reader.EndReadWaveform(ar); // GET THE DATA 

        // LAUNCH FFTs' THREADS 
        CancellationToken ct = cts.Token; 
        task1 = System.Threading.Tasks.Task.Factory.StartNew(() => 
        { 
         try 
         { 
          if (ct.IsCancellationRequested) 
          { 
           Console.WriteLine("Task {0}: Cancelling", task1.Id); 
           return; 
          } 
          Console.WriteLine("Task {0}: {1}/2 In progress", task1.Id, 1); 
          ConsumeToFFT(new FFT_Parameters(data.GetRawData(), overlap1, (int)Fmax1, 
           NbLines1, HP, avg1, window1, switchFreqUnit1.Value, swVelo.Value)); 
         } 
         catch (OperationCanceledException) 
         { 
          // Any clean up code goes here. 
          Console.WriteLine("Task {0}: Cancelling", task1.Id); 
          //throw; // To ensure that the calling code knows the task was cancelled. 
         } 
         catch (Exception) 
         { 
          // Clean up other stuff 
          //throw; // If the calling code also needs to know. 
         } 

        }, ct); 
      } 
      catch (DaqException ex) 
      { 
       MessageBox.Show(ex.Message); 
       runningTask = null; 
       myTask.Dispose(); 
      } 
     } 

Я читал, что я должен:

Положите вкручивается в фоновом режиме перед запуском (here)

Но больше ничего. Я застрял с этими сообщениями, и я не могу их проследить. Любые идеи, как я могу это исправить?

спасибо.

(я использую C#, Visual Studio, .NET 4.0)

+0

Где в вашем коде используется свойство Thread.Priority. Вам нужно показать код между тем, что у вас есть, и этим вызовом. –

+0

Кроме того, в вашем связанном отчете об ошибке, если вы прокрутите страницу вниз, вы увидите, что ошибка не имеет ничего общего с потоками, потому что программа не могла получить доступ к библиотеке libuv. –

+0

@Scott Chamberlain Спасибо за ответ. Я не использую «Thread.Priority» в моем коде. –

ответ

0

На самом деле я не был в состоянии проследить эту ошибку, и неким чудом это не там больше. Единственное, что я изменил здесь:

BlockingCollection<double[]> flowData = new BlockingCollection<double[]>(1); 

Декларирование моих данных как BlockingCollection, а затем использовать его как то в моем потребителе:

double[] dataToProcess = flowData.Take(); 

и как это в моем производителе:

flowData.TryAdd(data.GetRawData()); 

Я думаю, что факт, что мои данные не были защищены от состояния гонки нитей, вызвал ошибку. Даже если я не использую ни одного приоритета потока в своем коде, лучше защищать мои общие данные было решением, чтобы избавиться от моей ошибки.

Извините, ребята, это не лучшее объяснение, но, по крайней мере, у меня больше нет ошибки. Спасибо за помощь.