代码的目的是启动3个task,通过调用C DLL中getSWMMout方法读取同一二级制文件中不同部分,写3个文件,NdeExtract和LinkExtract方法和SubExtract方法代码结构一致。
当两个checkBox都选中时,报错代码:托管调试助手 "FatalExecutionEngineError":“运行时遇到了错误。此错误的地址为 0x6cb8f121,在线程 0x3f58 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。”。请问怎么解决呢?代码如下:
// Extract subcatch output values if checked
if (chkSub.IsChecked == true)
{
progressBar1.Value = 0;
// define file path for subcatchment extraction
string subcatchOutPath = "subcatch.txt";
// instaniate a task for extraction
var subTask = SubExtract(subcatchOutPath);
}
// Extract node output values if checked
if (chkNode.IsChecked == true)
{
progressBar2.Value = 0;
// define file path for node extraction
string nodeOutPath = "node.txt";
// instaniate a task for extraction
var nodeTask = NodeExtract(nodeOutPath);
}
// Extract linke output values if checked
if (chkLink.IsChecked == true)
{
progressBar3.Value = 0;
// define file path for link extraction
string linkOutPath = "link.txt";
// instaniate a task for extraction
var linkTask = LinkExtract(linkOutPath);
}
async Task SubExtract(string outPathSub)
//
// Purpose: extract variable outcome for subcatchment
//
{
int errSubID;
int cntSub = 0;
int sumSubPrd = Nsubcatch * extNperiod; // total for subcatchment outcome
float subValue = 0F; // outcome value for subcatchment extraction
// create file stream for writing file
FileStream fsSubcatch = new FileStream(outPathSub, FileMode.Create);
StreamWriter swSubcatch = new StreamWriter(fsSubcatch);
await Task.Run(() =>
{
for (int i = 0; i < Nsubcatch; ++i)
{
for (int j = 1; j <= extNperiod; ++j)
{
for (int k = 0; k < NsubcatchVar; ++k)
{
// getSWMMout为C DLL中方法
errSubcatch = getSWMMresult(SUBCATCH, i, k, j, ref subValue);
}
// update progressbar and textBlock value
cntSub++;
progressBar1.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
(Action)delegate ()
{
progressBar1.Value = cntSub * 100 / sumSubPrd;
});
}
}
// empty buffer
swSubcatch.Flush();
// close stream
swSubcatch.Close();
fsSubcatch.Close();
GC.Collect();
});
}
是这样的,硬件上来说
CPU比内存快10倍,内存比硬盘快10倍,
十个男人+一个女人,生孩子还是需要十个月的,不会变成一个月。
老哥你这个例子举的很幽默。
同一个物理设备的IO是独享的。也就是说,同一个文件你用多个线程去读(或写)。并不能提高IO使用,反而会因为磁盘磁头频繁移动变的更慢。即使是ssd也会变慢。