在启动wpf / mvvm app时启动后台线程的推荐方法是什么?也就是说,我想在UI初始化后立即启动一个线程。理想情况下,我想使用xaml / command来实现这一目标。
感谢。
答案 0 :(得分:1)
你想做什么?你确定要一个线程吗? 我假设您的程序将执行一些资源密集型操作,并且您希望UI保持响应。 如果您使用的是.NET 4.x,请查看任务并行库。 如果您使用的是.NET 5,请查看async / await模式。
这是我过去所做的事情: 在视图中:
<Button ToolTip="Delete Selected Item" Command="{Binding DeleteItemCommand}"/>
在ViewModel中:
public DelegateCommand DeleteItemCommand { get; private set; }
(在ViewModel的构造函数中):
this.DeleteItemCommand = new DelegateCommand(this.DeleteItem, this.CanDeleteItem);
void DeleteItem()
{
Task<int> task;
try
{
task = Task.Run(() => YourTaskMethod(yourParameter));
int result = task.Result;
}
catch(Exception ex)
}
static int YourTaskMethod(YourParameterType yourParameter)
{
//do complex stuff
return 1;
}
答案 1 :(得分:0)
在浏览了这个网站上的各种文章后,我意识到要走的路是使用EventTriggers。为了能够将触发器合并到我的应用程序中,我必须下载并安装Expression Blend SDK。
以下是适用于我的示例代码:
<Window x:Class="TestServer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
Title="MainWindow" Height="350" Width="525">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<!-- Execute a method called 'StartDaemon' defined in the view model -->
<ei:CallMethodAction TargetObject="{Binding}" MethodName="StartDaemon"/>
</i:EventTrigger>
<i:EventTrigger EventName="Closing">
<!-- Execute a method called 'StopDaemon' defined in the view model -->
<ei:CallMethodAction TargetObject="{Binding}" MethodName="StopDaemon"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<Grid>
<TextBlock Foreground="Red" Text="{Binding Path=DaemonText}" />
</Grid>
</Window>