如何在mvvm / wpf中启动应用启动时的bg线程?

时间:2014-07-22 14:31:08

标签: wpf mvvm

在启动wpf / mvvm app时启动后台线程的推荐方法是什么?也就是说,我想在UI初始化后立即启动一个线程。理想情况下,我想使用xaml / command来实现这一目标。

感谢。

2 个答案:

答案 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>