加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 通过进度条显示执行进度

发布时间:2020-12-15 07:38:46 所属栏目:百科 来源:网络整理
导读:我有一个愚蠢的问题,但我被困住了.我正在执行我的代码存储过程 过程需要时间,所以我正在显示一个进度条,它显示执行的进度,但存储过程执行,没有什么可以增加进度条的值. 这是我的代码 void btnYes_Click(object sender,EventArgs e){ if (DialogResult.Yes ==
我有一个愚蠢的问题,但我被困住了.我正在执行我的代码存储过程
过程需要时间,所以我正在显示一个进度条,它显示执行的进度,但存储过程执行,没有什么可以增加进度条的值.

这是我的代码

void btnYes_Click(object sender,EventArgs e)
{
   if (DialogResult.Yes == MessageBox.Show("Are you sure","",MessageBoxButtons.YesNo))
    {
        try
        {
         dbDataEntities db = new dbDataEntities();
        string myquery = "DECLARE @return_value int EXEC    @return_value = [dbo].[ssspUpdateMarksOfStudent] SELECT 'Return Value' = @return_value";
         //progressbar1.Maximum = 5000; 
         //progressbar1.value = ?; // how could i increment it
         //
         db.Database.ExecuteSqlCommand("myquery");



        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
}

另外我也尝试通过设置程序执行时没有增加的当前值,通过秒表来做到这一点

Stopwatch st = new Stopwatch();
st.Start();
progressbar1.Maximum = 5000; 
progressbar1.Value = Convert.ToInt16(st.Elapsed.Seconds);
//My stored procedure call 
st.Stop();

那么它只能通过使用后台工作人员来完成,还有其他的方法呢?

我是新的编程,所以没有使用后台工作者,所以我正在寻找一个替代方案.

请建议.提前致谢.

解决方法

一个有趣的想法SqlConnection提供了在服务器执行PRINT命令时触发的InfoMessage事件.您可以在存储过程的某些部分打印并收听此事件.
-- do something
PRINT '10 PERCENT COMPLETED';
-- do another thing
PRINT '20 PERCENT COMPLETED';
...
PRINT '100 PERCENT COMPLETED';

除此之外,请使用@ hamlet-hakobyan的解决方案.只显示无限进度条.

更新:更新以包含完整的解决方案

首先我讨厌给出完整的答案.它可以防止头脑找到解决方案的能力.相反,我喜欢将人们推向正确的路径,所以他们可以走路.
但在这里呢使用VS2012,NET4,MSIL在W7x64SP1和SQL2012下进行测试.

我非常耗时的SP.使用RaisError而不是打印立即发送消息.

Create Procedure usp_LongProcess As Begin

    Declare @i Int;
    Declare @msg VarChar(50);
    Set @i = 0;
    while (@i < 100) Begin
        WaitFor Delay '00:00:02';

        Set @i = @i + 10;
        Set @msg = Convert(VarChar(10),@i) + ' PERCENT COMPLETE';
        RaisError(@msg,1,1) With NoWait
    End
End

和我的形式

>一个按钮(CallSpButton)
>进度条(进度)
>标签(statusLabel)和
>一个具有WorkerReportsProgress的后台工作(SpCaller)设置为true.

而最后一个代码可以进行通话

private void CallSpButton_Click(object sender,EventArgs e)
{
    CallSpButton.Enabled = false;
    SpCaller.RunWorkerAsync();
}

private void SpCaller_DoWork(object sender,DoWorkEventArgs e)
{
    var self = (BackgroundWorker) sender;

    var cb = new SqlConnectionStringBuilder
    {
        DataSource = ".",InitialCatalog = "Sandbox",IntegratedSecurity = true
    };

    using (var cn = new SqlConnection(cb.ToString()))
    {
        cn.FireInfoMessageEventOnUserErrors = true;
        cn.Open();
        cn.InfoMessage += (o,args) => self.ReportProgress(0,args.Message);

        using (var cmd = cn.CreateCommand())
        {
            cmd.CommandText = "usp_LongProcess";
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.ExecuteNonQuery();
        }
    }
}

private void SpCaller_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
{
    CallSpButton.Enabled = true;
}

private void SpCaller_ProgressChanged(object sender,ProgressChangedEventArgs e)
{
    var message = Convert.ToString(e.UserState);
    Debug.WriteLine(message);
    statusLabel.Text = message;

    if (message.EndsWith(" PERCENT COMPLETE"))
    {
        int percent;
        if (int.TryParse(message.Split(' ')[0],out percent))
            progress.Value = percent;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读