클래스 라이브러리에 다음 코드가 있습니다. 그리고 주요 응용 프로그램으로 다시 전화를 기다립니다. 완료 후 콜백을 얻으려면 몇 초 기다려야하므로 DownloadStringAsync 호출을 만들고 있습니다. 기다려야 할 호출이 3 개이므로 주 응용 프로그램에서 AutoResetEvent를 사용하여 모두 끝내기를 기다립니다. 따라서 콜백 함수가 설정 될 때까지 차단할 것입니다.C# 스레딩 및 AutoResetEvent 사용
그러나 콜백 테스트 후에는 호출되지 않습니다. 코드가 AutoResetEvent에 의해 차단되어 DownloadStringAsync가 차단 될 때 생각하고 있습니다. 마찬가지로이 코드를 주석으로 모든 일을 잘 작동합니다.
그래서 전화를 걸면 바로 다음과 같이 생각합니다. objNoGateway.NoGatewayStatus (sipUsername, statusDisplay1.PhoneNumber); 코드가 여기에 도달하면 handle.WaitOne(); 클래스 라이브러리의 코드를 차단합니다.
조언에 대해 감사드립니다.
내 수업 도서관 코드 샘플.
// Event handler that makes a call back in my main application
// Event handler and method that handles the event
public EventHandler<NoGatewayEventArgs> NoGatewayCompletedEvent;
// The method that raises the event.
private void OnNoGatewayCompleted(object sender, NoGatewayEventArgs e)
{
if (NoGatewayCompletedEvent != null)
{
NoGatewayCompletedEvent(this, e);
}
}
// Start the Async call to find if NoGateway is true or false
public void NoGatewayStatus(string sipUsername, string phoneNumber)
{
string strURL = string.Format("http://xxxxxxxxxxxxxxx={0}&CalledNumber={1}", sipUsername, phoneNumber);
if (!wc.IsBusy)
{
try
{
string errorMsg = string.Empty;
wc.DownloadStringAsync(new Uri(strURL));
}
catch (WebException ex)
{
Console.WriteLine("IsNoGateway: " + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("IsNoGateway: " + ex.Message);
}
}
else
{
Console.WriteLine("WebClient: IsNoGateWay(): Busy please try again");
}
}
void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error == null)
{
if (e.Result == "No gateway")
{
OnNoGatewayCompleted(this, new NoGatewayEventArgs(validateResponse_e.VALIDATION_FAILED));
Console.WriteLine("NoGatway() DownloadedCompleted: " + e.Result);
}
else
{
OnNoGatewayCompleted(this, new NoGatewayEventArgs(validateResponse_e.OK));
Console.WriteLine("NoGateway() DownloadCompleted: " + e.Result);
}
}
else
{
this.OnNoGatewayCompleted(this, new NoGatewayEventArgs(validateResponse_e.SERVER_FAILED));
Console.WriteLine("No Gateway: DownloadCompleted() Error: " + e.Error.Message);
}
}
본인의 응용 프로그램에서이 콜백을 등록합니다. 그리고 결과를 기다리십시오. 그런 다음 AutoResetEvent를 설정하십시오.
내가 전화를 걸고 차단할 때의 부분.
NoGateway objNoGateway = new NoGateway()
objNoGateway.NoGatewayCompletedEvent += new EventHandler<NoGatewayEventArgs>(this.OnNoGatewayCompleted);
objNoGateway.NoGatewayStatus(sipUsername, statusDisplay1.PhoneNumber);
// Block here - Wait for all reponses to finish before moving on
waitEvent.WaitOne(5000, true);
Console.WriteLine("All thread finished");
======================== 편집은 하나를 가지고 내 문제를 혼동하지로 다른 2 개 콜백을 추가 당신은 항상 인덱스 0에 설정 호출 : ======================
private void OnCalledNumberBlockedCompleted(object sender, CalledNumberBlockedEventArgs e)
{
Console.WriteLine("OnCalledNumberBlockedCompleted: " + e.CalledNumberBlocked);
waitValidateCallResponse[1].Set();
}
private void OnValidTelephoneNumberCompleted(object sender, ValidTelephoneNumberEventArgs e)
{
Console.WriteLine("OnValidTelephoneNumberCompleted: " + e.validTelephoneNumber);
waitValidateCallResponse[2].Set();
}
코드에 따르면 "events.WaitOne() :"+ handle.ToString() 정확히 매달리기 전에 한 번 읽어야합니다. 당신은 당신의 포스트에서 그것에 대해 말하지 않았지만 그것은 중요한 단서입니다. 그래서 그 일이 일어 났습니까? – DonkeyMaster
이 행에는 도달하지 않습니다. Console.WriteLine ("events.WaitOne() :"+ handle.ToString()); – ant2009
디버깅이 필요하다면 디버거를 밟았을 것입니다. 어떤 코드 행이 실행되고 어떤 행이 실행되지 않는지를 알려줄 수 있습니까? 콜백이 실행 중입니까? wc_DownloadStringCompleted 메서드가 실행 되었습니까? 코드에서 OnValidTelephoneNumberCompleted 및 OnCalledNumberBlockedCompleted 메서드가 호출 된 위치를 표시하지 않았습니다. 또한 다음과 같은 메시지가 표시됩니다. public EventHandler NoGatewayCompletedEvent; 이상 ... NoGatewayCompletedEvent (this, e); 글쎄, 컴파일해서는 안된다. "event"키워드를 쓰지 않았다. 그러나 아마 할 일이 없을 것입니다. –
DonkeyMaster