none
backgroundWorker问题 RRS feed

  • 问题

  • 我用datagridview来导入500++资料,期间我有点卡。所以我用backgroundworker来解决。我遇到两个问题:

    1. 在backgroundWorker1_DoWork事件,要怎样写才可以显示“已完成”提示框,当已完成导入资料到datagridview里。

    2. 在backgroundWorker1_ProgressChanged事件,进度条要如何显示100%当完成导入资料。。。

    2012年3月6日 6:42

答案

全部回复

  • 我用datagridview来导入500++资料,期间我有点卡。所以我用backgroundworker来解决。我遇到两个问题:

    1. 在backgroundWorker1_DoWork事件,要怎样写才可以显示“已完成”提示框,当已完成导入资料到datagridview里。

    2. 在backgroundWorker1_ProgressChanged事件,进度条要如何显示100%当完成导入资料。。。

    DoWork只是一个处理复杂逻辑的事件,建议放while……或者Do……While进行处理。(你可以先参考微软MSDN的BackGroundWorker说明和示例代码:http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker(v=vs.80).aspx

    调用ReportProgress就自动引发ProgressChanged事件,记住先设置属性:

    【示例代码】

    Public Partial Class Form1
    	Inherits Form
    	Private fabresult As Long = 1
    	Private fabnum As Integer = 0
    	Public Sub New()
    
    		InitializeComponent()
    	End Sub
    	Private Sub Form1_Load(sender As Object, e As EventArgs)
    	End Sub
    
    	Private Sub backgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
    		While progressBar1.Value < progressBar1.Maximum
    			backgroundWorker1.ReportProgress(1)
    			'报告每次步长,引发   
    			Application.DoEvents()
    			Thread.Sleep(500)
    		End While
    		e.Result = fabresult
    	End Sub
    
    	Private Sub button1_Click(sender As Object, e As EventArgs)
    		'设置最大要计算的那个Fab数字
    		fabnum = Integer.Parse(textBox1.Text)
    		'表示最大值
    		progressBar1.Maximum = fabnum
    		'启动后台运行
    		backgroundWorker1.RunWorkerAsync()
    		'初始化progressbar
    		progressBar1.Value = 0
    		'初始化fab
    		fabresult = 1
    	End Sub
    
    	Private Sub backgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs)
    		progressBar1.Value += e.ProgressPercentage
    		fabresult *= progressBar1.Value
    	End Sub
    
    	Private Sub backgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs)
    		MessageBox.Show("计算完毕,结果:" & Convert.ToString(e.Result))
    	End Sub
    
    End Class

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年3月6日 8:31
    版主
  • 我用datagridview来导入500++资料,期间我有点卡。所以我用backgroundworker来解决。我遇到两个问题:

    1. 在backgroundWorker1_DoWork事件,要怎样写才可以显示“已完成”提示框,当已完成导入资料到datagridview里。

    2. 在backgroundWorker1_ProgressChanged事件,进度条要如何显示100%当完成导入资料。。。

    DoWork只是一个处理复杂逻辑的事件,建议放while……或者Do……While进行处理。(你可以先参考微软MSDN的BackGroundWorker说明和示例代码:http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker(v=vs.80).aspx

    调用ReportProgress就自动引发ProgressChanged事件,记住先设置属性:

    【示例代码】

    Public Partial Class Form1
    	Inherits Form
    	Private fabresult As Long = 1
    	Private fabnum As Integer = 0
    	Public Sub New()
    
    		InitializeComponent()
    	End Sub
    	Private Sub Form1_Load(sender As Object, e As EventArgs)
    	End Sub
    
    	Private Sub backgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs)
    		While progressBar1.Value < progressBar1.Maximum
    			backgroundWorker1.ReportProgress(1)
    			'报告每次步长,引发   
    			Application.DoEvents()
    			Thread.Sleep(500)
    		End While
    		e.Result = fabresult
    	End Sub
    
    	Private Sub button1_Click(sender As Object, e As EventArgs)
    		'设置最大要计算的那个Fab数字
    		fabnum = Integer.Parse(textBox1.Text)
    		'表示最大值
    		progressBar1.Maximum = fabnum
    		'启动后台运行
    		backgroundWorker1.RunWorkerAsync()
    		'初始化progressbar
    		progressBar1.Value = 0
    		'初始化fab
    		fabresult = 1
    	End Sub
    
    	Private Sub backgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs)
    		progressBar1.Value += e.ProgressPercentage
    		fabresult *= progressBar1.Value
    	End Sub
    
    	Private Sub backgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs)
    		MessageBox.Show("计算完毕,结果:" & Convert.ToString(e.Result))
    	End Sub
    
    End Class

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    我知道可以用do while/while来处理。。问题是什么时候停??我要怎样让系统知道有没有导入完毕(我的是一行一行的导入,不是一次过导入)??
    2012年3月6日 9:06
  • 如果你是使用记事本的话,那么使用StreamReader.ReadLine()!=null作为条件。

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年3月6日 9:07
    版主
  • 如果你是使用记事本的话,那么使用StreamReader.ReadLine()!=null作为条件。

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    1. thread.sleep(500) '这句用意是什么?不写有影响吗?

    2. 我是用file.readalltext的方式。null的方法好像不可以。。

    • 已编辑 ckjason 2012年3月6日 9:29
    2012年3月6日 9:19
  • 1)Thread.Sleep(500):当前线程停止半秒,让事件彻底执行完毕。来得及相应。

    2)File.ReadAllText:这个方法是一下子读入全部的String,不建议这样做,因为这样全部读入内存中会消耗大量内存。并且无法通过BackGroundWorker体现出来其优势。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 ckjason 2012年3月7日 9:09
    2012年3月6日 12:15
    版主