首页 新闻 会员 周边 捐助

C#多task读同一文件并更新进度条

0
悬赏园豆:20 [待解决问题]

代码的目的是启动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();
            });
        }
Pigman的主页 Pigman | 初学一级 | 园豆:182
提问于:2019-07-01 23:35
< >
分享
所有回答(2)
0

是这样的,硬件上来说
CPU比内存快10倍,内存比硬盘快10倍,
十个男人+一个女人,生孩子还是需要十个月的,不会变成一个月。

爱编程的大叔 | 园豆:30844 (高人七级) | 2019-07-02 09:17

老哥你这个例子举的很幽默。

支持(0) 反对(0) 江宁织造 | 园豆:73 (初学一级) | 2019-08-05 22:56
0

同一个物理设备的IO是独享的。也就是说,同一个文件你用多个线程去读(或写)。并不能提高IO使用,反而会因为磁盘磁头频繁移动变的更慢。即使是ssd也会变慢。

pencile | 园豆:845 (小虾三级) | 2019-07-02 09:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册