문제

Access를 동기화하기 위해 여러 장소에서 EventwaithAndle을 사용하는 상당히 잘 다중 스레드 Winforms 앱이 있습니다.

그래서 나는 이것과 비슷한 코드를 가지고 있습니다.

List<int> _revTypes;
EventWaitHandle _ewh = new EventWaitHandle(false, EventResetMode.ManualReset);

void StartBackgroundTask() {
    _ewh.Reset();
    Thread t = new Thread(new ThreadStart(LoadStuff));
    t.Start();
}

void LoadStuff() {
    _revTypes = WebServiceCall.GetRevTypes()
    // ...bunch of other calls fetching data from all over the place
    // using the same pattern
    _ewh.Set();
}


List<int> RevTypes {
    get {
        _ewh.WaitOne();
        return _revTypes;
    }
}

그럼 난 그냥 전화 해 .RevTypes UI의 sodewehre는 언제 나에게 데이터를 반환 할 것입니다. LoadStuff 실행을 마쳤습니다.

그러나이 모든 것이 완벽하게 올바르게 작동합니다 RevTypes 단지 하나의 속성입니다. 실제로 수십 개가 있습니다. 그리고 이러한 특성 중 하나 또는 몇 개가 UI가 빠르게로드되는 것을 막고 있습니다.

벤치 마크 코드를 각 속성에 배치하지 않으면 UI가 로딩에서 어떤 속성을 보유하고 있는지 확인할 수있는 방법이 있습니까? EventWaithAndle이 실제로 기다려야하는지 확인하는 방법이 있습니까?

도움이 되었습니까?

해결책

나는 당신이 무엇을 어떻게 달성하고 싶은지 잘 모르겠지만, 당신은 WaitHandle시간 초과가있는 s 0 현재 설정되어 있는지 확인하려면 다음과 같습니다.

class Program
{
    static void Main(string[] args)
    {
        EventWaitHandle[] waitHandles = new EventWaitHandle[3];
        for (int i = 0; i < 3; i++)
        {
            waitHandles[i] = new EventWaitHandle(false, EventResetMode.ManualReset);
        }
        waitHandles[1].Set();

        for (int i = 0; i < 3; i++)
        {
            if (waitHandles[i].WaitOne(0))
            {
                Console.WriteLine("Handle {0} is set", i);
            }
            else
            {
                Console.WriteLine("Handle {0} is not set", i);
            }
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top