我有一个使用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>
任何帮助都将非常感谢....
答案 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逻辑应该优雅地退出处理逻辑内部的循环,清理它使用的资源并执行您需要完成的任何撤消工作。