Tunggu dengan pernyataan pengembalian hingga Timer berlalu

Saya memiliki metode yang mengembalikan nilai bool, tetapi harus menunggu dengan mengembalikan nilai hingga System.Timers.Timer memunculkan peristiwa yang telah berlalu, karena nilai yang ingin saya kembalikan diatur dalam peristiwa penghitung waktu yang telah berlalu.

public static bool RecognizePushGesture()
{
    List<Point3D> shoulderPoints = new List<Point3D>();
    List<Point3D> handPoints = new List<Point3D>();
    shoulderPoints.Add(Mouse.shoulderPoint);
    handPoints.Add(Mouse.GetSmoothPoint());
    Timer dt = new Timer(1000);
    bool click = false;

    dt.Elapsed += (o, s) =>
    {
        shoulderPoints.Add(Mouse.shoulderPoint);
        handPoints.Add(Mouse.GetSmoothPoint());
        double i = shoulderPoints[0].Z - handPoints[0].Z;
        double j = shoulderPoints[1].Z - handPoints[1].Z;
        double k = j - i;
        if (k >= 0.04)
        {
            click = true;
            dt.Stop();
        }
    };

    dt.Start();

    //should wait with returning the value until timer raises elapsed event
    return click;
}

Terima kasih, Tim


person Tim T    schedule 23.10.2012    source sumber
comment
Jika pada dasarnya Anda ingin melakukan sesuatu secara sinkron (memblokir hingga selesai) mengapa Anda memulai pengatur waktu? Apa konteksnya di sini? (GUI, bukan GUI, GUI jenis apa?)   -  person Jon Skeet    schedule 23.10.2012
comment
Kalau hanya sekali saja...kenapa pakai timer? Jika Anda tidak keberatan memblokir thread saat ini, Anda dapat menggunakan Sleep() (atau tidak sama sekali). Jika Anda boleh melakukan pemrosesan lain sambil menunggu acara pertama yang telah berlalu, mengapa tidak menggunakan utas/tugas (yang akan Anda Gabungkan setelah selesai dengan pekerjaan paralel)?   -  person Adriano Repetti    schedule 23.10.2012
comment
oke, konteksnya adalah Kinect untuk Windows, saya perlu membandingkan koordinat z sendi tangan dan bahu dengan penundaan 1 detik   -  person Tim T    schedule 23.10.2012
comment
saya tidak ingin RecognizePushGesture() memblokir thread saya saat ini   -  person Tim T    schedule 23.10.2012
comment
@TimT RecognizePushGesture() pemanggil akan menunggu nilai kembaliannya sehingga HARUS menunggu. Jika tidak, Anda sebaiknya memfaktorkan ulang pemanggil juga (dan tidak menggunakan pengatur waktu dalam kasus ini): jadikan asinkron dan ganti pengatur waktu dengan Thread.Sleep(1000) yang sederhana.   -  person Adriano Repetti    schedule 23.10.2012
comment
Itu juga ide yang bagus, terima kasih atas bantuanmu kawan   -  person Tim T    schedule 23.10.2012
comment
Alternatifnya adalah membiarkan RecognizePushGesture mengambil delegasi sebagai parameter, yang akan berfungsi sebagai panggilan balik kapan pun k >= 0.04.   -  person ebb    schedule 23.10.2012


Jawaban (1)


Gunakan AutoResetEvent

public static bool RecognizePushGesture()
    {
        AutoResetEvent ar = new AutoResetEvent(false);
        List<Point3D> shoulderPoints = new List<Point3D>();
        List<Point3D> handPoints = new List<Point3D>();
        shoulderPoints.Add(Mouse.shoulderPoint);
        handPoints.Add(Mouse.GetSmoothPoint());
        Timer dt = new Timer(1000);
        bool click = false;
        dt.Elapsed += (o, s) =>
        {
            shoulderPoints.Add(Mouse.shoulderPoint);
            handPoints.Add(Mouse.GetSmoothPoint());
            double i = shoulderPoints[0].Z - handPoints[0].Z;
            double j = shoulderPoints[1].Z - handPoints[1].Z;
            double k = j - i;
            if (k >= 0.04)
            {
                click = true;
                dt.Stop();
            }
            ar.Set();
        };
        dt.Start();

        //should wait with returning the value until timer raises elapsed event
        ar.WaitOne();
        return click;
    }
person Amiram Korach    schedule 23.10.2012
comment
oke masalah terpecahkan baru saja memulai RecognizePushGesture() di thread sendiri. ini tidak lagi memblokir thread saya saat ini, terima kasih atas bantuan Anda :) - person Tim T; 23.10.2012