私はクラスライブラリに次のコードを書いています。私は主なアプリケーションにコールバックを待つ。私はそれが完了した後にコールバックを取得するために数秒待つ必要があるので、私は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を設定します。
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つのコールバックを追加し、あなたは常にインデックス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