C# 异步任务运行时如何更改progressbar值
我正在使用AsyncWait任务来运行这段代码,我想在提取时更改进度条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
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;
}
}