gpt4 book ai didi

c# - 子窗口中的任务暂停 UI

转载 作者:行者123 更新时间:2023-11-30 20:47:31 25 4
gpt4 key购买 nike

我有 AuthenticateWindowMainWindow,下面公开了标记和代码。它非常简单。当在 MainWindow 构造函数中我使用 Thread 类时它工作正常,但是如果我使用 Task 类,UI 被挂起,即'MainWindow'在 Thread.Sleep(5000); 结束时不显示。是否可以在没有任何 UI 挂起的情况下使用 Task 类(因为我需要它的取消机制和 Status 属性)?

重要条件:我无法修复 AuthWindow 中的代码。

验证窗口:

xaml

<Grid>
<Button Content="OpenMainWindow"
Click="ButtonBase_OnClick"></Button>
</Grid>

c#

public partial class AuthWindow : Window
{
public AuthWindow()
{
InitializeComponent();
}

private void DoAbsolutelyNothing()
{

}

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(DoAbsolutelyNothing).ContinueWith(t =>
{
var window = new MainWindow();
if (window.IsInitialized)
window.Show();

Close();
}, TaskScheduler.FromCurrentSynchronizationContext());
}
}

主窗口:

xaml

<Grid>
<TextBlock Text="MainWindow"></TextBlock>
</Grid>

c#

public partial class MainWindow : Window
{
private Task _task;

private void TestMethod()
{
Thread.Sleep(5000);
Debug.WriteLine("TestMethod comleted");
}

public MainWindow()
{
InitializeComponent();

// it works badly
//_task = Task.Factory.StartNew(TestMethod);

// it works fine
new Thread(TestMethod).Start();
}

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{

}
}

Windows 7、.Net 4.0

重要提示:暴露的代码重现了问题,只需复制粘贴即可!

最佳答案

你必须强制任务在另一个线程上运行

Task.Factory.StartNew(TestMethod, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);

更多内容:
Why Starting A New Task In The Task Parallel Library (TPL) Doesn’t Always Start A New Thread

关于c# - 子窗口中的任务暂停 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25744461/

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