Возвращение результата из функции после срабатывания ивента - C#

Узнай цену своей работы

Формулировка задачи:

Добрых времени суток. Вопрос звучит немного каряво, однако есть функция, которая включает камеру на телефоне:
private Bitmap bmp;
 
public Bitmap TakePhoto(string fileName)
{
      var intent = new Intent(MediaStore.ActionImageCapture);
 
      FilePath = new File(Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures), $"{fileName}.jpg").AbsolutePath;
      intent.PutExtra(MediaStore.ExtraOutput, FilePath);
 
      StartActivityForResult(intent, 0);
      
      //подождать пока OnActivityResult завершит работу
      return bmp;
}
Тут же имеется метод, который будет вызван, когда пользователь сделает фото:
protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
     base.OnActivityResult(requestCode, resultCode, data);
     bmp = (Bitmap)data.Extras.Get("data");
}
Собственно, как подождать завершения OnActivityResult?

Решение задачи: «Возвращение результата из функции после срабатывания ивента»

textual
Листинг программы
using System;
using System.Threading;
using System.Threading.Tasks;
 
namespace AddToFriendsExample
{
    class Program
    {
        private static Program _program;
 
        static void Main(string[] args)
        {
            _program = new Program();
            _program.Run(args);
        }
 
        private void Run(string[] args)
        {
            Console.WriteLine(TakePhoto("gfh"));
 
            Console.ReadKey();
        }
 
        private readonly AutoResetEvent _photoEvent = new AutoResetEvent(false);
        private string _text;
 
        public string TakePhoto(string fileName)
        {
            StartActivityForResult();
 
            // Ждём, пока другой поток отправт нам сигнал, что можно продолжать работу.
            _photoEvent.WaitOne();
 
            return _text;
        }
 
        private void StartActivityForResult()
        {
            // Имитация задержки, но без ожидания её вызывающим методом.
            Task.Run(() => OnActivityResult());
        }
 
        protected void OnActivityResult()
        {
            Thread.Sleep(1000);
            _text = "data";
            _photoEvent.Set();
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.833 из 5
Похожие ответы