Подождите, пока даже не произойдет и продолжить после того, как он обработан - PullRequest
0 голосов
/ 25 сентября 2018

Я удаленно управляю внешней камерой.Я могу сделать снимок с помощью асинхронного вызова метода TakePhotoAsync(), и когда снимок сделан и готов к загрузке, происходит событие DownloadReady, которое содержит DownloadInfo о снятом снимке.У меня есть метод Cam_DownloadReady(...) для обработки этого события.Это дано API, я ничего не могу изменить.

Но мне нужно сделать снимок синхронно.Что-то вроде вызова TakePhotoAsync() и ожидания в этой строке, пока не произойдет событие 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
}

1 Ответ

0 голосов
/ 26 сентября 2018

Этого можно добиться с помощью 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.
    }
...