首页 > 解决方案 > 等到甚至发生并在处理后继续

问题描述

我正在远程控制外部摄像头。我可以通过异步调用TakePhotoAsync()方法来拍照,当拍照并准备好下载时,DownloadReady会发生包含关于拍照的DownloadInfo的事件。我有方法Cam_DownloadReady(...)来处理这个事件。这是由 API 提供的,我无法更改任何内容。

但我需要同步拍照。类似于 callTakePhotoAsync()并在这一行等待直到事件DownloadReady发生,它调用Cam_DownloadReady(...)方法,然后在执行并完成此方法后,然后// continue..(如代码部分中标记的那样)。这可能吗?谢谢

public Task<CameraImage> GetImageFromCameraAsync(string cameraId) 
{
    APIHandler = new CanonAPI();
    Camera MainCamera = APIHandler.GetCameraList()[0];
    MainCamera.DownloadReady += Cam_DownloadReady;
    MainCamera.OpenSession();
    MainCamera.TakePhotoAsync();
    // wait here until event occurs and is processed
    // Cam_DownloadReady(...) is called and finished
    // continue ...
}

private void Cam_DownloadReady(Camera sender, DownloadInfo Info)
{
    sender.DownloadFile(Info, saveImageDir); //save picture on PC
}

标签: c#asynchronousevents

解决方案


您可以通过使用ManualResetEvent来实现:

using System.Threading;     
public ManualResetEvent mre = new ManualResetEvent(false); // created in the unsignaled state.

    public Task<CameraImage> GetImageFromCameraAsync(string cameraId)
    {
        mre.Reset(); // Set the state of the event to be nonsignaled 
        APIHandler = new CanonAPI();
        Camera MainCamera = APIHandler.GetCameraList()[0];
        MainCamera.DownloadReady += Cam_DownloadReady;
        MainCamera.OpenSession();
        MainCamera.TakePhotoAsync();
        // wait here until event occurs and is processed
        mre.WaitOne(); // Block the current thread until the current wait handle receives a signal
        // Cam_DownloadReady(...) is called and finished
        // continue ...
    }

    private void Cam_DownloadReady(Camera sender, DownloadInfo Info)
    {
        sender.DownloadFile(Info, saveImageDir); //save picture on PC
        mre.Set(); // Set the state of the event to signaled, allowing mre.WaitOne() above to proceed.
    }

推荐阅读