C#:异步回调 - 回调方法的处理是否会阻止应用程序?

时间:2011-06-29 19:44:18

标签: c# multithreading asynchronous callback

基本上,如果我调用异步方法,我的应用程序不会挂起,我可以单击事物等(如果我允许)而不会受到惩罚。异步操作完成后,将执行回调方法。

我想知道这是否会再次阻止事情还是仍然是“异步”?那就是说...回调方法是非常密集的,我的应用程序是否仍然运行良好,或者一旦进入回调方法就被阻止了?


更新

我所说的是添加服务引用并选择“异步操作”时创建的方法

public void AsyncSaveFooCompleted(Object sender, SaveFooEventArgs e)
{
    //Send a large binary from the WCF Service
    Client.SaveFooBinary(Foo.LargeBinary);
}

public void SaveFoo(Foo foo)
{
    Client.SaveFooAsync(foo);
}

4 个答案:

答案 0 :(得分:3)

如果你的回调是密集的话,你会遇到某种阻塞。如果您遇到此问题,请在异步方法中移动更多处理,并使回调变得简单明了。

或者,如果您需要分阶段处理此问题,请让回调启动另一个具有不同回调的异步进程。

答案 1 :(得分:3)

回调方法不应该是密集型的。在我看来,你的线程应该处理它的密集处理,并让回调只是渲染逻辑。

答案 2 :(得分:1)

我假设你在谈论C#5异步方法......

默认情况下,回调将在UI线程上执行。听起来你应该将昂贵的工作放在自己的任务中(例如使用TaskEx.Run),然后等待......假设繁重的处理没有在UI线程上执行。如果你从根本上得到了很多必须在UI线程上完成的工作,那么你可以做很多事情。

答案 3 :(得分:0)

您的问题有点模糊,因为您没有解释如何执行异步操作。如果您正在使用C#5.0中的新异步方法,如Jon Skeet建议,那么请遵循他的建议,但如果没有,那么最容易测试的方法(不管你是在进行异步),就是在回调中抛出一些阻塞代码

Thread.Sleep(10000)的某些内容,您将立即知道您的回调是否会阻止UI线程。但公平地说,你的UI线程永远不应该“密集”工作,除非用户因操作完成而无法继续或做任何事情,因为这个任务有一些要求,然后它并不重要,因为用户必须等待无论哪种情况。但是,您仍然可以考虑这个糟糕的设计,因为任何在UI线程上进行密集工作的UI都会获得臭名昭着的“无响应”,并且用户可能会对您的应用程序停止工作,即使它仍在执行任务。