gpt4 book ai didi

c# - GTK GUI 因 async/await 和 Progress 而卡住

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:42 26 4
gpt4 key购买 nike

我正在使用 GTK# 构建 GUI。一些数据在后台处理,我想在用户界面上看到一些关于进度的信息。下面是一些代码,展示了我尝试执行此操作的方式:

using System;
using Gtk;
using System.Threading.Tasks;
using System.Threading;

public partial class MainWindow: Gtk.Window
{
//a button and a textfield
private VBox VB = new VBox();
private Button B = new Button("Push dis");
private Label L = new Label("0");

public MainWindow () : base (Gtk.WindowType.Toplevel)
{

B.Clicked += OnClickEvent;
////////////////////
VB.PackStart (B);
VB.PackStart (L);
Add (VB);
ShowAll ();
Build ();
}

protected void OnDeleteEvent (object sender, DeleteEventArgs a)
{
Application.Quit ();
a.RetVal = true;
}

//async method incrementing variable, simulating some work and sending its progress
protected async Task CounterGUIUpdateAsync(IProgress<string> progress)
{
await Task.Run (() => {
for (int i = 0; i <= 10000; i++) {
Thread.Sleep (100);
if(progress != null)
{
var stri = Convert.ToString(i);
progress.Report(stri);

}
}
});
}

//event handler for the button
protected async void OnClickEvent(object sender, EventArgs e)
{
var ProgressIndicator = new Progress<string> (ReportProgress);
await CounterGUIUpdateAsync (ProgressIndicator);
}

//action connected to the progress instance
protected void ReportProgress(string value)
{
L.Text = value;
}
}

运行代码将按预期开始,但在某些时候显示的计数器可能会卡住。 GUI 将不再更新,如果已最小化则变为黑色。它仍然可以使用。

非常感谢您的帮助。

最佳答案

我认为您的问题是您在使用 Gtk+ API 时没有使用主线程(gui 线程)。您需要使用 Gtk.Application.Invoke() 传递一个操作 UI 的委托(delegate),以便在正确的线程中执行操作。

您可以阅读更多相关信息 here .

关于c# - GTK GUI 因 async/await 和 Progress<T> 而卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25096088/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com