【发布时间】:2014-09-09 12:18:56
【问题描述】:
我有AuthenticateWindow 和MainWindow,标记和代码在下面公开。它非常简化。当在MainWindow 构造函数中我使用Thread 类时,它工作正常,但如果我使用Task 类,UI 将被挂起,即在Thread.Sleep(5000); 过去时不显示'MainWindow'。是否可以在不暂停任何 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.Wait();什么地方?
-
@Gusdor,正如我上面写的:UI 已暂停,即 Thread.Sleep(5000); 时未显示“MainWindow”;已过。
-
@George Vovos,上面的代码没有任何
_task.Wait();并且 UI 被暂停:( -
你为什么需要 _Task 变量?你的代码看起来没问题。我认为问题出在其他地方。当你简化代码时,你错过了一些东西
标签: c# wpf multithreading xaml task