求救...winform调试完全正常,运行exe数据量一大就死
如题,软件是一个读取文件的,里面有大量数据,文件数目量也比较大.将文件读取到datatable,然后绑定gridview进行显示.使用的backgroundWorker.
调试的时候怎么都正常.没有意外.
问题就在按ctrl+f5或者直接运行bin下面exe的时候,在文件数少的情况下正常,但是当读取大量文件时,到最后完成的时候,整个软件就死掉了(应该是在完成backgroundWorker_DoWork后几秒,因为读取文件是执行完了的,然后会死在调用完成函数backgroundWorker_RunWorkerCompleted的途中,注意是途中...但是这个函数并不执行什么复杂的,只是改变一下label,如果不使用RunWorkerCompleted函数,则会在完成后几秒软件莫名死掉)...
代码没有什么特别的
//按钮调用
private void Load_Button_Click(object sender, EventArgs e)
{
if (Directory.Exists(textBox_FilePath.Text) && (textBox_FilePath.Text != null))
{
backgroundWorker_load.RunWorkerAsync();
}
else
{
MessageBox.Show("Wrong folder path?");
}
}
//DoWork函数
private void backgroundWorker_load_DoWork(object sender, DoWorkEventArgs e)
{
buttonenable(false);
load185.initdt();
string[] files = new string[256];
int count = 0;
PublicLoadFunc.GetFileList(textBox_FilePath.Text.Trim(), files, ref count);
if (files[0] == null)
{
MessageBox.Show("No file found.");
return;
}
for (int i = 0; i < count; i++)
{
backgroundWorker_load.ReportProgress((i * 100 + 50) / count,i.ToString()+"/"+count.ToString()+ " Loading " + files[i].ToString().Trim() + ".");
NewDelegate startLoad = new NewDelegate (load185.LoadOneFile);
startLoad.Invoke(files[i].ToString().Trim(), i);
//load185.LoadOneFile(files[i].ToString().Trim(), i);//这里用不用委托都一样
backgroundWorker_load.ReportProgress(((i + 1) * 100) / count, (i+1).ToString() + "/" + count.ToString() + " Loading " + files[i].ToString().Trim() + " completed.");
Application.DoEvents();
}
}
完全想不明白了,也不知道怎么调试,弄了一天了哎,伤感...求高手指教
------解决方案--------------------(文件数目量也比较大)可能是太占内存了啊
要是几十万。。。。那要占多大内存啊
------解决方案--------------------在WinForm中经常遇到一些费时的操作界面,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成“假死”的情况,或者报“线程间操作无效”的异常,为了解决这个问题,可以使用委托来处理,在.net2.0中还可以用BackgroundWorker类。BackgroundWorker类是.net 2.0里新增加的一个类,对于需要长时间操作而不需要用户长时间等待的情况可以使用这个类。 注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
------解决方案--------------------今天正好尝试打开自己的程序写的运行日志
500多M,打不开!!!
你这问题咱没见过,只能帮顶
------解决方案--------------------首先从代码看,似乎lz对于BackgroundWorker理解的不太完全正确,DoWork里面还在访问界面的控件是根本不对的。
至于假死,那原因可多了去了,不调试是没办法的。至于调试,WinDbg + SOS最实际了,可惜BW多线程还搞不清楚的估计没那么容易上手。
付费找个高手去你那里帮你看看好了。反正基本就是你代码的问题。人家Visual Studio编译一大堆文件都你这么假死的。
------解决方案--------------------肯定是代码问题 不是逻辑问题 就是组件的使用问题! 根据LZ贴出来的代码 应该是BackgroundWorker的使用问题 就如2楼说的一样:
"注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信" 实在不行 你就用new Thread + delgate试试!就算操作20个G我也遇到过问题!
------解决方案--------------------肯定是代码的问题 一是逻辑问题 二是使用组件的方法问题 根据LZ贴出来的代码看来 就是BackgroundWorker的使用问题了 就如二楼所说的:
"注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信" 注意访问用户界面的方式!