我有使用Python开发软件(GUI平台PyQt)的经验,我正在学习C#中的软件开发。我想知道如何在C#中运行一个使用UI对象的线程/任务,但保持UI" alive"而不是按住按钮。我曾经使用过" Invoke"用线程/任务共享UI对象的方法并没有调用任何连接方法,但在线程执行期间仍然按下按钮。有没有办法在后台运行此方法,但保持GUI响应?
提前致谢!
private async void Button_Click(object sender, RoutedEventArgs e)
{
await Task.Run(new Action(this.Iterate_balance));
}
private async void Iterate_balance()
{
this.Dispatcher.Invoke(() =>
{
// the rest of code
}
}
答案 0 :(得分:3)
正确使用async / await模式,你根本不需要Dispatcher:
private async void Button_Click(object sender, RoutedEventArgs e)
{
await Iterate_balance();
}
private async Task Iterate_balance()
{
button.Content = "Click to stop";
// some long async operation
await Task.Delay(TimeSpan.FromSeconds(4));
button.Content = "Click to run";
}
答案 1 :(得分:1)
尝试:
1.使用以下内容添加以下内容:using System.ComponentModel;
2.Declare background worker:
private readonly BackgroundWorker worker = new BackgroundWorker();
3.注册活动:
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
4.实施两种方法:
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
// run all background tasks here
}
private void worker_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e)
{
//update ui once worker complete his work
}
5.只要你需要,就可以运行工作人员。
worker.RunWorkerAsync();
此外,如果要报告进程进度,则应订阅ProgressChanged事件并在DoWork方法中使用ReportProgress(Int32)来引发事件。还设置如下:worker.WorkerReportsProgress = true;
希望得到这个帮助。