DispatcherHelper to thread

时间:2011-09-26 19:28:44

标签: c# .net wpf mvvm

我有一个使用1个主窗口的应用程序,而且这个窗口有5个UserControl,它们是使用功能区控件创建的。

在其中一个用户控件上,我启动了一个帖子:

if (AmtMembersWithEmail > 0)
{
    DispatcherHelper.UIDispatcher.Invoke(new Action(() =>
    {
        max = 100;
        Messenger.Default.Send<ShowProgressWindowMessage>(
                              new ShowProgressWindowMessage(this));
        Progress = 0;
        Thread.Sleep(1000);                               
    }));

所以这个线程启动并报告进度回到主窗口,在此期间,当线程执行时,用户无法访问控件或在应用程序中执行任何其他操作,从读取调度程序这是正常的,因为它必须使用单个UIThread,它允许用户与UI上的控件进行交互。 (顺便使用Galasoft MVVM灯!)

显示报告进度的窗口有一个命令,该命令绑定到我的视图模型中的中继命令:从XAML进度窗口中提取如下:

<tk:LoadingAnimation Grid.Row="0" DataContext="{Binding}"/>        
<ContentControl Visibility="{Binding CanBeAborted, 
                Converter={StaticResource VisibilityConverter}}" >
    <Hyperlink Command="{Binding AbortCommand}">cancel</Hyperlink>
</ContentControl>

有没有办法使用调度程序允许线程在后台运行?或者用户是否必须等到操作完成?

要添加,线程实际执行的工作是循环客户数据,创建附件(发票)并为每个客户创建电子邮件对象,然后最终循环新电子邮件集合并将每封电子邮件单独发送给客户...... < / p>

任何帮助都将非常感谢....

1 个答案:

答案 0 :(得分:1)

我不完全清楚您是否在用户控件(即代码隐藏)或ViewModel中具有处理逻辑。如果它在你的ViewModel中,那么我认为你是在正确的轨道上。

我建议不要使用调度程序来旋转BackgroundWorker:

    public void DoWork()
    {
        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += (sender, e) =>
        {
            //Processing Logic here
        };
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Work_Completed);
        worker.RunWorkerAsync();
    }

    void Work_Completed(object sender, RunWorkerCompletedEventArgs e)
    {

    }

这不会在UI线程上运行,因此您的用户控件应该是响应式的。另外,按照建议,不要终止线程。您的Abort逻辑应该优雅地退出处理逻辑内部的循环,清理它使用的资源并执行您需要完成的任何撤消工作。