这是异步调用同步方法的正确方法吗?

发布于 2024-12-07 14:17:23 字数 297 浏览 1 评论 0原文

我使用的是这样的代码:

handler.Invoke(sender, e);

但该代码的问题是它是同步的,它真正做的只是更新 GUI。服务器没有必要等待它完成,因此应该将其设置为异步。

我真的不想使用 BeginInvoke 和 EndInvoke,因为在这种情况下不需要回调方法。

这是一个合适的替代方案吗?

Task.Factory.StartNew(() => handler.Invoke(sender, e));

I was using code like this:

handler.Invoke(sender, e);

But the problem with that code is that it is synchronous and all it really does is update the GUI. It is not necessary for the server to wait for it to complete so it should be made asynchronous.

I don't really want to use BeginInvoke and EndInvoke because a callback method is not necessary in this case.

Is this a suitable alternative?

Task.Factory.StartNew(() => handler.Invoke(sender, e));

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

倾`听者〃 2024-12-14 14:17:24

您这样做的方式很好,在 .NET 3.5 上执行此操作的另一种方法是使用 ThreadPool 类。

ThreadPool.QueueUserWorkItem(new WaitCallback((a) => handler.Invoke(sender, e)))

另外,如果处理程序恰好是从控件派生的,则 您可以在没有相应 EndInvoke 的情况下调用 BeginInvoke。

The way you did it is fine, another way to do this that works on .NET 3.5 is using the ThreadPool class instead

ThreadPool.QueueUserWorkItem(new WaitCallback((a) => handler.Invoke(sender, e)))

Also if handler happens to be a derived from control, you are allowed to call BeginInvoke without a corresponding EndInvoke.

凉世弥音 2024-12-14 14:17:24

对 GUI 的调用很特殊,因为它们必须始终从 GUI 线程完成。用你自己的话说,handler.Invoke(sender, e)“更新了 GUI”,但它(可能)不是从 GUI 线程执行的,所以它当前的形式并不好。

在 WinForms 中,您需要将任务委托包装到 Control.Invoke 中(或者忘记任务,只使用 Control.BeginInvoke)。

如果是 WPF,您可以将任务委托包装到 Dispatcher.Invoke 中(或者仅使用没有任务的 Dispatcher.BeginInvoke)。

Calls to GUI are special in that they must always be done from the GUI thread. In your own words, handler.Invoke(sender, e) "updates the GUI", yet it is (probably) not executed from the GUI thread, so it not OK in its current form.

In WinForms, you'll need to wrap your task delegate into Control.Invoke (or forget about tasks and just use Control.BeginInvoke).

If WPF, you can wrap your task delegate into Dispatcher.Invoke (or just use Dispatcher.BeginInvoke without a task).

原野 2024-12-14 14:17:24

我不熟悉 C# 4 的 Task 类,但我知道 BeginInvoke 在没有 EndInvoke 的情况下也能正常工作。我有时会写这样的代码:

handler.BeginInvoke(sender, e, null, null);

编辑:我错了。虽然 EndInvoke 并不是使代码在新线程上执行所必需的,但文档明确指出 EndInvoke 很重要。

I'm not familiar with C# 4's Task class, but I know BeginInvoke works just fine without EndInvoke. I sometimes write code like this:

handler.BeginInvoke(sender, e, null, null);

Edit: I was mistaken. While EndInvoke is not necessary to cause the code to execute on a new thread, the documentation clearly states that EndInvoke is important.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文