รอด้วยคำสั่ง return จนกระทั่ง Timer ผ่านไป

ฉันมีวิธีการที่ส่งคืนค่าบูล แต่ควรรอโดยส่งคืนค่าจนกว่า System.Timers.Timer จะเพิ่มเหตุการณ์ที่ผ่านไป เนื่องจากค่าที่ฉันต้องการส่งคืนถูกตั้งค่าในเหตุการณ์ที่ผ่านไปของตัวจับเวลา

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;
}

ขอบคุณทิม


person Tim T    schedule 23.10.2012    source แหล่งที่มา
comment
หากคุณต้องการทำอะไรบางอย่างพร้อมกัน (บล็อกจนกว่าจะเสร็จสิ้น) ทำไมคุณถึงเริ่มจับเวลาเลย? บริบทที่นี่คืออะไร? (GUI ไม่ใช่ GUI GUI ประเภทใด)   -  person Jon Skeet    schedule 23.10.2012
comment
ถ้าจะยิงเพียงครั้งเดียว...ทำไมต้องใช้ตัวจับเวลาด้วย? หากคุณไม่ต้องการบล็อกเธรดปัจจุบัน คุณอาจใช้ Sleep() (หรือไม่ต้องทำอะไรเลย) หากคุณอาจดำเนินการอื่นในขณะที่รอเหตุการณ์ที่ผ่านไปครั้งแรก ทำไมไม่ใช้เธรด/งาน (ที่คุณจะเข้าร่วมเมื่อเสร็จสิ้นการทำงานแบบขนาน)   -  person Adriano Repetti    schedule 23.10.2012
comment
ตกลง บริบทคือ Kinect สำหรับ Windows ฉันต้องเปรียบเทียบพิกัด z ของข้อต่อมือและไหล่โดยมีความล่าช้า 1 วินาที   -  person Tim T    schedule 23.10.2012
comment
ฉันไม่ต้องการให้ RecognizePushGesture() บล็อกเธรดปัจจุบันของฉัน   -  person Tim T    schedule 23.10.2012
comment
@TimT RecognizePushGesture() ผู้โทรจะรอค่าที่ส่งคืนดังนั้นจึงต้องรอ หากไม่ควร คุณควรปรับโครงสร้างผู้โทรใหม่ด้วย (และอย่าใช้ตัวจับเวลาในกรณีนี้): ทำให้เป็นแบบอะซิงโครนัสและแทนที่ตัวจับเวลาด้วย Thread.Sleep(1000) แบบธรรมดา   -  person Adriano Repetti    schedule 23.10.2012
comment
เป็นความคิดที่ดีเช่นกัน ขอบคุณสำหรับความช่วยเหลือของคุณ   -  person Tim T    schedule 23.10.2012
comment
ทางเลือกอื่นคือให้ RecognizePushGesture รับมอบสิทธิ์เป็นพารามิเตอร์ ซึ่งจะทำงานเป็นการโทรกลับทุกครั้งที่ k >= 0.04   -  person ebb    schedule 23.10.2012


คำตอบ (1)


ใช้เหตุการณ์รีเซ็ตอัตโนมัติ

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
ตกลง แก้ไขปัญหาแล้ว เพิ่งเริ่ม RecognizePushGesture() ในเธรดของตัวเอง สิ่งนี้ไม่ได้บล็อกเธรดปัจจุบันของฉันอีกต่อไป ขอบคุณสำหรับความช่วยเหลือของคุณ :) - person Tim T; 23.10.2012