首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待异步方法在C#中结束

等待异步方法在C#中结束
EN

Stack Overflow用户
提问于 2011-03-30 08:04:28
回答 5查看 1.7K关注 0票数 0

样本代码:

代码语言:javascript
复制
    class Program
{
    static readonly object locker = new object();

    static void Main(string[] args)
    {
        Func();
        Func();

        Thread.Sleep(6000);
    }

    static void Func()
    {
        Monitor.Enter(locker);
        Action act = () =>
                    {
                        Thread.Sleep(2000);
                    };
        act.BeginInvoke(a =>
                        {
                            Console.WriteLine("exiting..");
                            Monitor.Exit(locker);
                        }, null);
        Console.WriteLine("Func done...");
    }
}

理想情况下,控制台将打印出来:

代码语言:javascript
复制
Func done...
exiting...
Func done...
exitting...

但是,我得到了:

代码语言:javascript
复制
Func done...
Func done...
exitting...

然后Monitor.Exit抛出异常

对象同步方法是从不同步的代码块调用的。

这里的错误是什么?实现这一目标的首选方法是什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-03-30 08:15:17

Monitor.Enter(锁存器)位于当前线程上,Monitor.Exit位于另一个线程上,因为它是从当前线程调用的。

因此,您也需要使用Monitor.Wait和Monitor.Pulse,但ManualResetEvents在您的情况下更容易使用。

票数 2
EN

Stack Overflow用户

发布于 2011-03-30 08:15:01

Monitor.EnterMonitor.Exit调用必须在同一个线程上进行。在您的示例中,您在UI线程上调用Monitor.Enter,在为BeginInvoke触发的异步调用创建的线程上调用Monitor.Exit

如果您想在Func中等待异步操作完成,您可以这样做:

代码语言:javascript
复制
class Program
{
    static void Main(string[] args)
    {
        Func();
        Func();

        Thread.Sleep(6000);
    }

    static void Func()
    {
        Action act = () =>
                {
                    Thread.Sleep(2000);
                };
        IAsyncResult actAsyncResult = act.BeginInvoke(a =>
                {
                    Console.WriteLine("exiting..");
                }, null);

        Console.WriteLine("Func done...");

        act.EndInvoke(actAsyncResult);
    }
}

不过,在您的场景中,您只需同步调用委托即可。

票数 4
EN

Stack Overflow用户

发布于 2011-03-30 08:08:35

我认为您可以使用ManualResetEvent类等待事件的完成。对不起,我对Monitor没有任何经验。但是我使用ManualResetEvent / AutoResetEvent类来测试回调。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5483575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档