无法访问线程已死的优先级

时间:2016-11-30 21:04:41

标签: c# .net multithreading visual-studio

我正在使用多线程开发一个应用程序。

我有一个每200ms产生一些数据的线程(来自采集设备的振动数据)。每次我重新获取数据时,我都会开始执行几项任务。在我的开发PC上没有错误。但是,当我在功能较弱的平板电脑上部署项目时,我会多次出现以下消息:

  

线程死了。无法访问优先级。

这是我的代码:

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)

1 个答案:

答案 0 :(得分:0)

实际上我无法追踪错误,而且由于某种奇迹,它已经不存在了。我唯一改变的是:

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

将我的数据声明为BlockingCollection,然后在我的消费者中使用它:

double[] dataToProcess = flowData.Take();

和我的制片人一样:

flowData.TryAdd(data.GetRawData());

我认为我的数据没有受到线程竞争条件保护的事实产生了错误。即使我在代码中没有使用任何线程优先级,更好地保护我的共享数据也是摆脱错误的解决方案。

对不起,伙计,这不是最好的解释,但至少我不会再有错误了。谢谢你的帮助。