我最近构建了一个原型c#控制台应用程序,用于从四个仪器并行读取测量结果(在同一个TimeStamp
上),我使用了parallel.invoke命令来执行此操作,结果每次都很好。后来我试图用backgroundworker
在Winforms
中实现相同的概念。因此,在我的DoWork
中,我将这个parallel.invoke称为运行这四个函数来获取读数,但结果经过这么长时间后才会返回,并且它们不在同一时间戳上,我没有使用背景工人尝试它,但是我得到了相同的结果。任何人都知道为什么parallel.invoke表现如此。它在控制台应用程序中正常工作,而不是在winform中?还有一种方法可以确保多个async procces
执行并行运行?我很难理解这一点,请在这里帮助我。任何意见将不胜感激!parallel.invoke在Winform和控制台应用程序中的行为有所不同
更新:抱歉,我之前并行调用了 后来我将其更改为任务,但行为相同。
控制台应用程序:
public static void funcc()
{
for (int i = 0; i < 5; i++)
{
rawData3 = fmio.IO.Read(4 * numReadings);
RawData3.Add(rawData3);
}
}
public static void funcd()
{
for (int i = 0; i < 5; i++)
{
rawData4 = fmio.IO.Read(4 * numReadings);
RawData4.Add(rawData4);
}
}
static void Main(string[] args)
{
//Parallel.Invoke(() => { funcb(); },() => { funcc(); },() => { funca(); },() => { funcd(); });
var factory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None);
Task t1 = factory.StartNew(funca);
Task t2 = factory.StartNew(funcb);
Task t3 = factory.StartNew(funcc);
Task t4 = factory.StartNew(funcd);
t1.Wait();
t2.Wait();
t3.Wait();
t4.Wait();
WriteToFile(); // Writes Result to the file
}
在我GUI应用程序我感到在backgroundWorker
这样做我也有同样的读数功能,如上所定义我使用我的GUI应用程序:
public static void funca()
{
for (int i = 0; i < 5; i++)
{
rawData = fmio.IO.Read(4 * numReadings); // Getting Data in Byte Array
RawData1.Add(rawData); // Putting it in ArrayList
}
}
public static void funcb()
{
for (int i = 0; i < 5; i++)
{
rawData2 = fmio.IO.Read(4 * numReadings);
RawData2.Add(rawData2);
}
}
private void btn_StartMeasurement_Click(object sender, EventArgs e)
{
if (!bwObj.IsBusy)
{
bw_Obj.RunWorkerAsync();
}
}
private void bw_Obj_DoWork_1(object sender, DoWorkEventArgs e)
{
//Parallel.Invoke(() => { funcb(); },() => { funcc(); },() => { funca(); },() => { funcd(); });
var factoryA = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None);
var time = System.Diagnostics.Stopwatch.StartNew();
Task t1 = factoryA.StartNew(() => funca(Globls.numReadings, DMM));
Task t2 = factoryA.StartNew(() => funcb(Globls.numReadings, DMM2));
Task t3 = factoryA.StartNew(() => funcc(Globls.numReadings, DMM3));
Task t4 = factoryA.StartNew(() => funcd(Globls.numReadings, DMM4));
t1.Wait();
t2.Wait();
t3.Wait();
t4.Wait();
WriteToFile();
}
你在使用什么硬件?你有多少个CPU核心? – 2012-07-10 08:15:26
它的英特尔核心-i5 – user1514077 2012-07-10 08:18:27
一个简单的代码示例,包括控制台代码和Windows窗体代码在这里真的很有帮助。 – 2012-07-10 08:18:49