我正在使用多线程开发一个应用程序。
我有一个每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)
答案 0 :(得分:0)
实际上我无法追踪错误,而且由于某种奇迹,它已经不存在了。我唯一改变的是:
BlockingCollection<double[]> flowData = new BlockingCollection<double[]>(1);
将我的数据声明为BlockingCollection,然后在我的消费者中使用它:
double[] dataToProcess = flowData.Take();
和我的制片人一样:
flowData.TryAdd(data.GetRawData());
我认为我的数据没有受到线程竞争条件保护的事实产生了错误。即使我在代码中没有使用任何线程优先级,更好地保护我的共享数据也是摆脱错误的解决方案。
对不起,伙计,这不是最好的解释,但至少我不会再有错误了。谢谢你的帮助。