首页 > Windows开发 > 详细

C# 异步转同步

时间:2018-02-25 10:38:45      阅读:226      评论:0      收藏:0      [点我收藏+]

当我们的程序运行时,调用了一段异步的逻辑A,这段异步的逻辑无法转化为同步(如动画、下载进度等)

而,我们又需要等待异步逻辑A处理完成,然后再执行其它逻辑B。

那就迫切需要将异步转同步了!

 //参数bool:若要将初始状态设置为终止,则为 true;若要将初始状态设置为非终止,则为 false

 AutoResetEvent autoResetEvent = new AutoResetEvent(false)

AutoResetEvent 可以在线程间发送信号互相通信,通过调用 AWaitOne 来等待信号,调用Set发送信息来启动已等待的线程。

很简单:一个await ,另一个set来唤醒。

    private async Task SetDelegateProgress()
    {
        var delegateProgress = new UIDelegateProgress();
        delegateProgress.ProgressCompleted += () =>
        {
            autoResetEvent.Set();
        };
        DelegateProgress = delegateProgress;
        await Task.Run(() => { autoResetEvent.WaitOne(); });
    }

如上案例,当delegateProgress执行完后,通过AutoResetEvent 的方法Set来发送信息来唤醒子线程。

值得注意的是,WaitOne只能在子线程,如果放在主线程的话,会将整个线程终止(例如界面或者其它后台逻辑)

 

AutoResetEvent 可以在多个线程使用WaitOne来暂停线程,而暂停的线程则需要多次set来开启暂停的线程。

给你AutoResetEvent 类似的,还有一个ManualResetEvent。ManualResetEvent 是多个暂停线程,可以通过一次set直接开启全部暂停的线程。

ManualResetEvent与AutoResetEvent 不同的还有Reset方法,Reset与Set相反,为主动暂停线程。

详细ManualResetEvent & AutoResetEvent可参考:https://www.cnblogs.com/maitian-lf/p/3672390.html

C# 异步转同步

原文:https://www.cnblogs.com/kybs0/p/8468464.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!