Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步任务运行时如何更改progressbar值_C#_.net_.net 4.5 - Fatal编程技术网

C# 异步任务运行时如何更改progressbar值

C# 异步任务运行时如何更改progressbar值,c#,.net,.net-4.5,C#,.net,.net 4.5,我正在使用AsyncWait任务来运行这段代码,我想在提取时更改进度条 public async Task<string> DownloadAndExtractFile(string source, string destination, string ItemDownload) //source = File Location //destination = Restore Location { string zPath = @"C:\Program Fil

我正在使用AsyncWait任务来运行这段代码,我想在提取时更改进度条

public async Task<string> DownloadAndExtractFile(string source, string destination, string ItemDownload) //source = File Location //destination = Restore Location
    {
        string zPath = @"C:\Program Files\7-Zip\7zG.exe";
        ProcessStartInfo pro = new ProcessStartInfo();
        pro.WindowStyle = ProcessWindowStyle.Hidden;
        pro.FileName = zPath;
        pro.Arguments = "x \"" + source + "\" -o" + destination;

        await Task.Run(() =>
        {
            Restore.frmRestore.progressBar1.Value = 50; //already set to public
            try
            {
                Process x = Process.Start(pro);
                Task.WaitAll();
                Restore.frmRestore.progressBar1.Value = 100;//already set to public
                x.Close();
                Console.WriteLine("Extract Successful.");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

        }
           );

        return "Success";
    }
公共异步任务下载和提取文件(字符串源、字符串目标、字符串项下载)//源=文件位置//目标=还原位置
{
字符串zPath=@“C:\ProgramFiles\7-Zip\7zG.exe”;
ProcessStartInfo pro=新的ProcessStartInfo();
pro.WindowStyle=ProcessWindowStyle.Hidden;
pro.FileName=zPath;
pro.Arguments=“x\”“+source+”\“-o”+destination;
等待任务。运行(()=>
{
Restore.frmRestore.progressBar1.Value=50;//已设置为public
尝试
{
进程x=进程启动(pro);
Task.WaitAll();
Restore.frmRestore.progressBar1.Value=100;//已设置为public
x、 Close();
Console.WriteLine(“提取成功”);
}
捕获(例外情况除外)
{
Console.WriteLine(例如ToString());
}
}
);
返回“成功”;
}
如何在任务运行时更改progressbar值。这是错误“跨线程操作无效:从创建控件“progressBar1”的线程以外的其他线程访问该控件。”

,如我在博客中所述:

public async Task<string> DownloadAndExtractFile(string source, string destination, string ItemDownload)
{
  string zPath = @"C:\Program Files\7-Zip\7zG.exe";
  ProcessStartInfo pro = new ProcessStartInfo();
  pro.WindowStyle = ProcessWindowStyle.Hidden;
  pro.FileName = zPath;
  pro.Arguments = "x \"" + source + "\" -o" + destination;

  IProgress<int> progress = new Progress<int>(
      value => { Restore.frmRestore.progressBar1.Value = value; });

  await Task.Run(() =>
  {
    progress.Report(50);
    try
    {
      Process x = Process.Start(pro);
      Task.WaitAll();
      progress.Report(100);
      x.Close();
      Console.WriteLine("Extract Successful.");
    }
    catch (Exception ex)
    {
      Console.WriteLine(ex.ToString());
    }
  });
  return "Success";
}
公共异步任务下载和提取文件(字符串源、字符串目标、字符串项下载)
{
字符串zPath=@“C:\ProgramFiles\7-Zip\7zG.exe”;
ProcessStartInfo pro=新的ProcessStartInfo();
pro.WindowStyle=ProcessWindowStyle.Hidden;
pro.FileName=zPath;
pro.Arguments=“x\”“+source+”\“-o”+destination;
i进展=新进展(
value=>{Restore.frmRestore.progressBar1.value=value;});
等待任务。运行(()=>
{
进度报告(50);
尝试
{
进程x=进程启动(pro);
Task.WaitAll();
进度报告(100);
x、 Close();
Console.WriteLine(“提取成功”);
}
捕获(例外情况除外)
{
Console.WriteLine(例如ToString());
}
});
返回“成功”;
}
您可以使用。这允许您将进度通知UI线程并更新进度栏

因此,在调用该任务的位置,执行以下操作:

Progress<int> progress = new Progress<int>(i => Restore.frmRestore.progressBar1.Value = i);
await DownloadAndExtractFile(source, destination, ItemDownload, progress);

注意:您必须通过
progress
作为接口类型
IProgress
才能访问该接口的
报告
方法。

直接解决方案,但不像
progress
那样花哨:

创建一个函数:

private void UpdateProgress(int percent)
{
  if (Restore.frmRestore.progressBar1.InvokeRequired)
  {
    UpdateProgress.Invoke(percent);
  }
  else
  {
    Restore.frmRestore.progressBar1.Value = percent;
  }
}
然后调用它,而不是直接设置值

要澄清:
.Invoke
在主线程(即UI线程)上执行函数


这是你不希望的1:1,但我会使用
Progress

我已经使用
Signal R
使用
asp.net MVC
应用程序更新
html
元素中的进度条值,但是我可以在
MVC
web应用程序中使用相同的进度条吗?@stom:如果你是指asp.net核心,然后,
IProgress
的内置支持已从信号器中删除。不过,你可以自己建造。
private void UpdateProgress(int percent)
{
  if (Restore.frmRestore.progressBar1.InvokeRequired)
  {
    UpdateProgress.Invoke(percent);
  }
  else
  {
    Restore.frmRestore.progressBar1.Value = percent;
  }
}