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

前端之家收集整理的这篇文章主要介绍了c# – 通过进度条显示执行进度前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个愚蠢的问题,但我被困住了.我正在执行我的代码存储过程 @H_404_2@过程需要时间,所以我正在显示一个进度条,它显示执行的进度,但存储过程执行,没有什么可以增加进度条的值.

这是我的代码

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的解决方案.只显示无限进度条.

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

首先我讨厌给出完整的答案.它可以防止头脑找到解决方案的能力.相反,我喜欢将人们推向正确的路径,所以他们可以走路.@H_404_2@但在这里呢使用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)@H_404_2@>进度条(进度)@H_404_2@>标签(statusLabel)和@H_404_2@>一个具有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;
    }
}

猜你在找的C#相关文章