У меня есть следующий код в библиотеке классов. И я жду вызова в основное приложение. Я делаю вызов DownloadStringAsync, поэтому мне нужно подождать несколько секунд, чтобы получить обратный вызов после его завершения. У меня есть 3 из этих вызовов, чтобы подождать, поэтому в моем основном приложении я использую AutoResetEvent, чтобы подождать, пока все они закончатся. Поэтому я заблокирую, пока они не будут установлены в функции обратного вызова.C# Threading и использование 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.
ManualResetEvent[] waitValidateCallResponse = new ManualResetEvent[]
{ new ManualResetEvent(false), new ManualResetEvent(false), new ManualResetEvent(false) };
// Event handler for NoGateway event
private void OnNoGatewayCompleted(object sender, NoGatewayEventArgs e)
{
Console.WriteLine("OnNoGatewayComleted: " + e.noGateway);
waitValidateCallResponse[0].Set();
}
Часть, когда я звоню и блокирую.
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 других обратных вызовов, чтобы не запутать вопрос меня просто имеющий только один ======================
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. Кроме того, это раздражает меня: общественный EventHandler NoGatewayCompletedEvent; и дальше ... NoGatewayCompletedEvent (это, e); Ну, это не должно компилироваться, вы не пишете ключевое слово «событие». Но, вероятно, нечего делать. –
DonkeyMaster