C# Winform 开发,非常棘手,开帮帮我吧。

magicleey1124 2010-02-18 06:04:50
我在另一个帖子中也发了相关的,但这个帖子我做了比较详细的描述。
最近c# winform开发一个程序,要求这个月底就要完成,根据界面选择的时间段自动提取这个时间段的数据库的信息,并且进行计算,需要很长时间,运算后把结果存入另一个数据库中。
有几个问题需要解决一下:
1. 要求一运行程序就要自动进行计算,但是因为运算时间很长,这样我就看不到开始界面,得等到运行完才能看到,但是要求要先看到界面,再进行自动运算,不许加什么按钮之类的,不知道怎么能实现。
2. 因为程序正在运算,这时候如果关闭则会跳出错误窗口。要求在程序进行时候关闭界面(注意是关闭界面右上角的小X)不让他跳出错误。并且是关电脑的时候让正在运行的程序也自动关闭,不出现错误。
3. 如果在程序运行过程中关闭界面,在这个时间段内运行程序生成的新的数据不存到新的数据库中,新的数据只有当程序完全运行完才存到新的数据库中,这样方便下次程序能接着上次的数据库运行,重新计算。

可能问题比较多,希望大家帮帮我,我刚学C#不长时间,就让我挑战这么难度的项目,在这里先谢谢大家了。
希望能详细的讲一下如何实现,不要只说用Thread什么的,因为我上网找了点例子,跟我的不太相关,也有点看不懂。如果用thread,希望能详细的讲讲,在这里先谢谢了。
...全文
1027 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
magicleey1124 2010-02-26
  • 打赏
  • 举报
回复
结贴了,谢谢这么多好心人的帮忙,项目做完了,很成功。

我说一下我的项目中遇到的问题及其解决办法:
1. 程序开始界面不能Load,解决办法是采用 双线程。
2. 第二个线程想操纵第一个线程里面的控件,方法用的是35楼的。
3. 关闭界面还跳出错误 得设置 thread.IsBackGround==true
4. 一次导入 90多万条数据容易死机,办法是按照每天来导入数据,因为我的项目的要求得按整天来,如果没有要求则可以一次导入固定数量的数据。

再次谢谢好心人。
ttzyanswer 2010-02-25
  • 打赏
  • 举报
回复
引用 59 楼 mayonglong 的回复:
引用 21 楼 jackson35296 的回复:还有用winform进行开发的?

牛?~


jackson35296 老兄孤陋寡闻罢了. 哈哈. 你见的少不等于没有.而且....实际上很多....
sybgulo 2010-02-23
  • 打赏
  • 举报
回复
计算要用单独的线程才可以!
zhushoudong 2010-02-23
  • 打赏
  • 举报
回复
我顶二楼的,至于看不到主页面像是死机的,早c#有doevent这个东东的 就是在执行程序多长时间的时候就会刷一下你的页面的,不至于你看不到你的界面的
vssvss 2010-02-23
  • 打赏
  • 举报
回复
对一开始运行就有大量计算的winform,推荐winform自带的线程:backgroundWork。好多函数都是写好的。
具体操作见51楼。
  • 打赏
  • 举报
回复
我也碰见过这样的需求
我的办法是做一个Splash,程序启动后显示一个封面(单独线程),封面上有进度条,后面程序继续处理数据
当数据处理完毕,停止封面线程,启动主界面
liuh6 2010-02-23
  • 打赏
  • 举报
回复
不错,学习中....
jeremy 2010-02-23
  • 打赏
  • 举报
回复
大家把解决方案都告诉你了,剩下的就靠你自己写代码了!
其实你说的无非就是两件事
1.用多线程
2.用 try catch
至于第三个,你肯定是处理完了才提交至数据库的,都没处理完,提交数据库的肯定没有做了,
万一你要是分多次提交到数据库,你可以用事物来做,这样,在遇到没有完全处理完业务的时候就关闭了,你可以通过 RollBack 恢复
夏脑 2010-02-23
  • 打赏
  • 举报
回复
第1种方法:在Shown事件中处理数据;
第2种方法:在Load事件中新加入一个线程,在线程中处理数据
artren 2010-02-23
  • 打赏
  • 举报
回复
个人觉得用backgroundWorker1
1\开始执行
backgroundWorker1.RunWorkerAsync();

2\执行
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
int sss = 10;
int aaaa = 1;
backgroundWorker1.ReportProgress(aaaa);
for (int i = 0; i < sss; i++)
{
if (backgroundWorker1.CancellationPending)
{
break;
}
//你可以在这里处理数据了,分批处理都可以,即使想让用户看界面\使用软件都可以,处理完它自己会停止的
if ((i + 1) * 10 / sss > aaaa)
{
aaaa++;
e.Result = i + 1;
if (aaaa <= 10)
{
backgroundWorker1.ReportProgress(aaaa * 10);
}
}
}
}
}
3\再来个进度条
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
4\收工回家
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar1.Value = 0;
}
magicleey1124 2010-02-23
  • 打赏
  • 举报
回复
谢谢大家的帮忙,问题差不多解决了。

还有最后一个问题,就是想完全跳出thread的时候(就是关闭form右上角的小X那个),会出现错误。
我想实现随时都可以跳出线程,不管是不是在进行计算的时候。

不知道这样的程序该怎么编呢?最好能说的详细一些。比如用try-catch怎么用?在catch里该如何编写呢?
详细一些,谢谢了。
mayonglong 2010-02-23
  • 打赏
  • 举报
回复
引用 21 楼 jackson35296 的回复:
还有用winform进行开发的?


牛?~
a296694166 2010-02-22
  • 打赏
  • 举报
回复
winform winform winform winform winform
aking250583189 2010-02-22
  • 打赏
  • 举报
回复
大家都是大好人啊,我先谢谢了,一会我再慢慢读读大家说的办法。

在这里祝好人一生平安!
jackson35296 2010-02-22
  • 打赏
  • 举报
回复
引用 25 楼 messinews 的回复:
引用 21 楼 jackson35296 的回复:还有用winform进行开发的?

阁下是用什么开发的?


WPF
lianyi68 2010-02-22
  • 打赏
  • 举报
回复
learning。。。
zhangshuang2n 2010-02-22
  • 打赏
  • 举报
回复
学习了,很好的,这个太有用了,找了很多地方都没找到了
linwei_2008 2010-02-22
  • 打赏
  • 举报
回复
linwei8235@gmail.com 招聘 C# winform 及 其他方面的开发人员, 有需要工作的发简历到邮箱。
工作地点: 双安商场附近
待遇 : 3 - 8 k
viki117 2010-02-22
  • 打赏
  • 举报
回复
多线程就可以了,不过新手用多线程,一定要注意,单个线程就好了,
另外要注意委托的使用和资源冲突的问题,适当的用lock很重要
gispanguohui 2010-02-22
  • 打赏
  • 举报
回复
哇塞,又学了一招,正好用到现在的项目里。
加载更多回复(39)

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧