Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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# 如何从WndProc调用异步方法?_C#_Async Await_Wndproc - Fatal编程技术网

C# 如何从WndProc调用异步方法?

C# 如何从WndProc调用异步方法?,c#,async-await,wndproc,C#,Async Await,Wndproc,我有一个程序,使用自定义消息从WndProc调用一些方法,如下所示: protected override void WndProc(ref Message m) { switch ((uint)m.Msg) { case WM_QUIT: Application.Exit(); return; case WM_STARTOP: Context.TændNas();

我有一个程序,使用自定义消息从WndProc调用一些方法,如下所示:

protected override void WndProc(ref Message m)
{
    switch ((uint)m.Msg)
    {
        case WM_QUIT:
            Application.Exit();
            return;
        case WM_STARTOP:
            Context.TændNas();
            m.Result = new IntPtr(1);
            break;
    }
    base.WndProc(ref m);
}
现在我想让这些方法异步。 但是,我无法将async关键字添加到WndProc覆盖中

如果我将Context.Tændnasaync设置为异步方法,那么如何从WndProc调用它

结论:

我同意@Hans Passant的建议,创建一个异步事件处理程序。这样,我可以在UI线程上调用async方法,同时使其保持异步等待状态。

这应该可以:

Task.Run(()=>Context.TaendNas());
或者更确切地说:

Task.Run(async ()=> await Context.TaendNas());
这应该起作用:

Task.Run(()=>Context.TaendNas());
或者更确切地说:

Task.Run(async ()=> await Context.TaendNas());


这不是“开火并忘记”吗?您可以尝试在任务运行结束时添加.Wait方法:task.run…Wait;但问题是如何从synch contextCan运行异步方法无法使用此方法访问UI控件!你当然可以。但要做到这一点,您必须确保您正在从UI线程访问UI控件。没有任何线索。您可以使用Invoke来完成。但这是完全不同的情况。在Task.Run中包装同步方法在这里没有帮助,并以使用者无法处理的方式更改WndProc的行为,即方法将在完成之前返回。您的secodn示例也不起作用,因为TaendNas不会返回一个开始的任务。这不是“激发并忘记”吗?您可以始终尝试在任务运行结束时添加.Wait方法:Task.run…Wait;但问题是如何从synch contextCan运行异步方法无法使用此方法访问UI控件!你当然可以。但要做到这一点,您必须确保您正在从UI线程访问UI控件。没有任何线索。您可以使用Invoke来完成。但这是完全不同的情况。在Task.Run中包装同步方法在这里没有帮助,并以使用者无法处理的方式更改WndProc的行为,即方法将在完成之前返回。您的secodn示例也不起作用,因为TaendNas不会返回一个以开始的任务。WndProc通常会引发一个事件,以允许客户端代码响应该消息。您也可以在这里这样做,以获得异步void事件处理程序。当心新的。你应该运行一些从消息处理功能花费太多时间的东西。您只能启动任务或创建后台工作程序,但不能阻止GUI线程。。。这不是一个好主意,可能会导致不可预见的行为。@julo,这是不正确的,Windows窗体是基于消息的,甚至长时间运行的任务都是通过按钮单击消息来启动的。@PoulBak:我知道这是可能的,但你不应该这样做。GUI将停止响应,这可能会导致用户混淆,或者在最坏的情况下,操作系统可能会终止应用程序。应用程序没有响应。停止/关闭应用程序?-windowWndProc通常会引发一个事件,以允许客户端代码响应消息。您也可以在这里这样做,以获得异步void事件处理程序。当心新的。你应该运行一些从消息处理功能花费太多时间的东西。您只能启动任务或创建后台工作程序,但不能阻止GUI线程。。。这不是一个好主意,可能会导致不可预见的行为。@julo,这是不正确的,Windows窗体是基于消息的,甚至长时间运行的任务都是通过按钮单击消息来启动的。@PoulBak:我知道这是可能的,但你不应该这样做。GUI将停止响应,这可能会导致用户混淆,或者在最坏的情况下,操作系统可能会终止应用程序。应用程序没有响应。停止/关闭应用程序?-窗