繁体   English   中英

如何在进行中的对话框中正确调用后台线程?

How to call a background thread properly in a work in progress dialog?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我们应用程序的主窗口将打开一个正在进行的对话框,该对话框应调用一个后台线程。 该对话框应出现,直到线程完成:

var dialog = new WorkInProgressDialog();
dialog = ShowDialg;

现在的问题是在哪里/如何在WorkInProgressDialog构造函数中调用线程? 如果在构造函数中调用该对话框,则在线程完成之前该对话框不可见。

线程完成后,对话框也应自动关闭。

1 个回复

这是一个希望对您有所帮助的示例。 WorkInProgressDialog的一些简单标记:

<Window x:Class="WorkInProgressExample.WorkInProgressDialog"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WorkInProgressDialog" Height="100" Width="300" WindowStyle="None" 
    ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
    <Border BorderThickness="3" CornerRadius="5" BorderBrush="Black" Padding="10">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"></RowDefinition>
                <RowDefinition Height="Auto"></RowDefinition>
                <RowDefinition Height="Auto"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
            </Grid.RowDefinitions>            

            <TextBlock Grid.Row="1" Name="WorkProgressTextBlock">Work in progress...</TextBlock>
            <ProgressBar Grid.Row="2" Height="30" Name="WorkProgressBar"></ProgressBar>
        </Grid>
    </Border>
</Window>

然后在后面的代码中:

private bool _closeAuthorised = false;

public WorkInProgressDialog()
{
    InitializeComponent();

    WorkProgressBar.Maximum = 10;
    WorkProgressBar.Minimum = 0;

    Task.Factory.StartNew(() =>
    {
        // Do whatever processing you need to here
        for (int i = 0; i < 10; i++)
        {
            // Any updates to the UI need to be done on the UI thread
            this.Dispatcher.Invoke((Action)(() =>
            {
                WorkProgressBar.Value = i;
            }));

            Thread.Sleep(1000);
        }

        // Set the DialogResult and hence close, also on the UI thread
        this.Dispatcher.Invoke((Action)(() =>
        {
            _closeAuthorised = true;
            this.DialogResult = true;
        }));

    });
}

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    // If the user uses ALT+F4 to try andclose the loading dialog, this will cancel it
    if (!_closeAuthorised)
        e.Cancel = true;
    base.OnClosing(e);
}

然后在您要使用它的地方:

var dialog = new WorkInProgressDialog();
bool? result = dialog.ShowDialog();
1 如何在Qt Quick 2中正确打开对话框?

我有一个自定义对话框,如下所示: CustomDialog.qml 现在,我在main.qml文件中使用此自定义对话框: 当我运行应用程序时,将执行Component.onCompleted ,但是我希望在单击Button后打开对话框后执行此事件。如何执行此操作? ...

4 后台线程和对话框

我有一个小程序,它以应用栏开头(停靠在桌面上的窗口,可以隐藏起来(不使用时位于桌面的顶部,右侧,底部或左侧)。该程序允许用户拖动将文件从任意给定位置放到应用栏上,然后将其转换为PDF(通过将每个文件转换为PDF,然后将生成的PDF合并为一个PDF文件)。 转换过程使用后台工作程序在单独的线 ...

2019-02-21 00:54:25 2 76   c#
5 使用后台崩溃对话框中的对话框

我有一堆获取数据的AsyncTasks。 他们通过显示对话框来更新执行进度。 有时,这会导致应用程序在后台(不可见)时崩溃。 我的代码在下面调用。 在不完全重构对话框的情况下,我可以做哪些检查来防止应用程序崩溃? 这些在DownloadAsyncTask中声明,并在构造函数中传递 ...

6 如何在AJAX JSON调用后关闭jQuery对话框

我正在使用ASP.NET MVC 4 , jQuery和jQuery UI 。 我的视图上有一个对话框。 当我单击一个按钮时,将弹出对话框,获取对话框中的值并将其发送给服务。 该服务将执行其所需的操作,如果成功,则将发送回空白消息,或者发送实际的错误消息。 之后,我需要在客户端检查错 ...

7 Spring MVC:进行AJAX调用后在对话框中显示数据

我是Spring和Web技术的新手。 我有一个表,其中包含带有超链接的列。 当我单击一行的超链接时,我需要在对话框中显示该行的数据以及其他详细信息。 我的控制器方法返回一个ModelAndView ,其中包含我需要显示的数据和显示页面。 问题: 如何显示对话框? 和 ...

8 如何在无模式的UI线程之上的后台线程中显示对话框?

有没有一种方法可以在后台线程中显示表单,但是您总是可以在UI线程前面看到它是无模式的? 例如,UI线程与parentForm一起运行,而有一个backgroundworker线程与childForm一起运行在顶部。 我可以将parentForm与childForm放在顶部进行无模式交互, ...

9 如何在QML(QT)中正确使用文件对话框?

我正在使用QML开发应用程序,并且是使用QML的初学者。 我要单击“按我”按钮,然后打开一个文件对话框,然后选择一个文件夹。 然后单击“确定”后,列表视图将列出UI上该文件夹中的所有图像。 但是,我的程序在启动时立即显示文件对话框,而无需单击任何按钮。 此外,“按我”按钮在单击时没有 ...

10 如何在React中正确实现对话框组件

我正在使用react-modal npm软件包并将其包装在自己的组件中,这样我就可以在整个应用程序中重用某些行为和样式。 我想要的是能够将所有输入模式对话框的行为封装在一个单独的组件中,并将其作为React标记插入到我要使用此对话框行为的任何页面中。 我的问题是我不确定控制对话框打开 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM