gpt4 book ai didi

c# - 如何使用 Task.Wait 避免 WinForm 卡住

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

所以我有类似的代码

private void doSmth()
{
str = makeStr();
}
private void button_Click(object sender, EventArgs e)
{
Task task = new Task(doSmth);
task.Start();
task.Wait();
textBox.Text = str;
}

太冷了,我知道为什么会这样,因为 Wait()。我试图像这样使用 ContinueWith()

task.ContinueWith((t) => {textBox.Text = str;});

但是抛出 InvalidOperationException 不起作用:

The calling thread cannot access this object because a different thread owns it

我该如何解决这个问题?也许我应该完全使用另一种方法来实现我想要的。谢谢。

最佳答案

你会想要这个:

private String DoSomething() {

return makeStr(); // return it, don't set it to a field.
}

private async void button_Click(...) {

String result = await Task.Run( DoSomething );
textBox.Text = result;
}

...等价于此:

private async void button_Click(...) {

// Task<> is the .NET term for the computer-science concept of a "promise": https://en.wikipedia.org/wiki/Futures_and_promises
Task<String> resultPromise = Task.Run( DoSomething );
String result = await resultPromise;
textBox.Text = result;
}

...这(大致)等同于此:

private void button_Click(...) {

Thread thread = new Thread( () => {

String result = DoSomething();
this.BeginInvoke( () => {

this.textBox.Text = result;
} );

} );
thread.Start();
}

关于c# - 如何使用 Task.Wait 避免 WinForm 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42793434/

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