Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用异步任务处理多个对话框窗口_C#_.net_Async Await_Task Parallel Library - Fatal编程技术网

C# 使用异步任务处理多个对话框窗口

C# 使用异步任务处理多个对话框窗口,c#,.net,async-await,task-parallel-library,C#,.net,Async Await,Task Parallel Library,在我的WinForm应用程序主窗口中,我想同时打开多个无模式对话框。当所有对话框窗口都打开时,我将引发一些事件,并且单个打开对话框上的事件处理程序应该对这些事件采取必要的操作。由于用户希望一直访问主窗体,所以我无法将这些窗口作为模式对话框打开 我已经编写了以下代码 使用此代码,对话框窗口将打开,但也会立即关闭。代码怎么了?为什么窗户不开着 private async void buttonOpenWindows_Click(object sender, EventArgs e) {

在我的WinForm应用程序主窗口中,我想同时打开多个无模式对话框。当所有对话框窗口都打开时,我将引发一些事件,并且单个打开对话框上的事件处理程序应该对这些事件采取必要的操作。由于用户希望一直访问主窗体,所以我无法将这些窗口作为模式对话框打开

我已经编写了以下代码

使用此代码,对话框窗口将打开,但也会立即关闭。代码怎么了?为什么窗户不开着

private async void buttonOpenWindows_Click(object sender, EventArgs e)
{

        Task[] tasks = new Task[]
        {
            Task.Factory.StartNew(CreateWindow),
            Task.Factory.StartNew(CreateWindow),
            Task.Factory.StartNew(CreateWindow),
            Task.Factory.StartNew(CreateWindow)
        };

        await Task.WhenAll(tasks);

        // Raise necessary events when all windows are loaded.              
}

private async Task CreateWindow()
{
    // A refernce to main form is passed to the Window because all Windows will be subsribing to some events raised by the main form.
    var window = new Window1(this);
    window.Show();
}

发生了什么:

private async Task CreateWindow()
{
    // A refernce to main form is passed to the Window because all Windows will be subsribing to some events raised by the main form.
    var window = new Window1(this);
    window.Show();
}
这将创建一个新窗口,由系统中第一个可用线程拥有。由于没有更多要运行的阻塞代码,
任务
成功完成,因此
窗口
关闭/释放

如果希望继续打开
窗口
,则需要在主线程中打开它


但是,不确定以
异步
方式打开
窗口会从中获得什么好处。

发生了什么:

private async Task CreateWindow()
{
    // A refernce to main form is passed to the Window because all Windows will be subsribing to some events raised by the main form.
    var window = new Window1(this);
    window.Show();
}
这将创建一个新窗口,由系统中第一个可用线程拥有。由于没有更多要运行的阻塞代码,
任务
成功完成,因此
窗口
关闭/释放

如果希望继续打开
窗口
,则需要在主线程中打开它


但是,不确定以
异步
方式打开
窗口会从中获得什么好处。

您不应该使用
Task.Factory.StartNew
,只需使用
CreateWindow()
@CamiloTerevinto:谢谢。我可以知道为什么使用
Task.Factory.StartNew
是不正确的,为什么它不能保持窗口打开?我的答案中解释了窗口关闭的原因。为什么不使用
Task.Factory.StartNew
,可以在的
备注
部分找到,您确定async/await是此作业的正确工具吗?我在您对正在实现的功能的描述中没有看到任何需要它的内容。您根本不应该使用
Task.Factory.StartNew
,只需使用
CreateWindow()
@CamiloTerevinto:谢谢。我可以知道为什么使用
Task.Factory.StartNew
是不正确的,为什么它不能保持窗口打开?我的答案中解释了窗口关闭的原因。为什么不使用
Task.Factory.StartNew
,可以在的
备注
部分找到,您确定async/await是此作业的正确工具吗?在你对你正在实现的功能的描述中,我没有看到任何需要它的东西。对于其他人,实际的代码修复在我的问题下的Camilo评论中提到。为了使代码正常工作,我必须只调用
CreateWindow()
,而不使用
Task.Factory.StartNew
。对于其他人,实际的代码修复在我问题下的Camilo评论中提到。为了使代码正常工作,我必须只调用
CreateWindow()
,而不使用
Task.Factory.StartNew