C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 非同期サーバーソケットのBeginSendについて


(過去ログ 67 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■38969 / inTopicNo.1)  非同期サーバーソケットのBeginSendについて
  
□投稿者/ たろ (41回)-(2009/07/28(Tue) 11:50:45)

分類:[.NET 全般] 

おせわになっております。たろです。

使用言語:ASP.NET・C#でwindowサービスを作成しています。

初歩的な質問です。

非同期サーバーソケットの送信で下記のように戻り値を判断したいのですが、
正しい結果が返ってきていないような気がします。

どのサンプルを見ても戻り値を取得していないのですが、
BeginSendの戻り値はあまり意味ないのでしょうか?

System.IAsyncResult Result = handler.BeginSend(sendBytes, 0, sendBytes.Length, 0, new AsyncCallback(OnSendMsg), socketPacket);

↓どちらもだいたいfalseで戻ってくる
if((Result.CompletedSynchronously) || (Result.IsCompleted))
{
 //成功時の処理
}

【よくみられるサンプル】
handler.BeginSend(sendBytes, 0, sendBytes.Length, 0, new AsyncCallback(OnSendMsg), socketPacket);







引用返信 編集キー/
■38976 / inTopicNo.2)  Re[1]: 非同期サーバーソケットのBeginSendについて
□投稿者/ Hongliang (438回)-(2009/07/28(Tue) 13:01:05)
> ASP.NET・C#でwindowサービス
構成がよく分かりませんが……。まあ本題とは関係ないですけど。

> System.IAsyncResult Result = (略
> if((Result.CompletedSynchronously) || (Result.IsCompleted))

これは一つのメソッド内で続けて書いているのですよね?
BeginSend は非同期的に送信を行う物で、送信が完了する前に処理を返します。
ですので、この if 文が処理されるとき、別スレッドで送信処理を行っているところです。
当然、そのわずかな間に送信処理が完了することなどまずありません。
ですから IsComleted などはまだ false です。

意味があるかどうかは実装者次第ですね。
送信完了まで放置するなら、呼び出し側が IAsyncResult を扱うことはあまりないかも知れません。
引用返信 編集キー/
■38981 / inTopicNo.3)  Re[2]: 非同期サーバーソケットのBeginSendについて
□投稿者/ たろ (42回)-(2009/07/28(Tue) 13:50:43)
Hongliang さんご返信ありがとうございます!

なるほど、
ということは、送信の完了をもって処理を行いたい場合は、下記のような感じ問題ないでしょうか?

private static ManualResetEvent sendDone = new ManualResetEvent(false);

System.IAsyncResult Result = handler.BeginSend(sendBytes, 0, sendBytes.Length, 0, new AsyncCallback(OnSendMsg), socketPacket);

sendDone.WaitOne();

if(Result.IsCompleted)
{
 //成功時の処理
}



No38976 (Hongliang さん) に返信
>>ASP.NET・C#でwindowサービス
> 構成がよく分かりませんが……。まあ本題とは関係ないですけど。
>
>>System.IAsyncResult Result = (略
>>if((Result.CompletedSynchronously) || (Result.IsCompleted))
>
> これは一つのメソッド内で続けて書いているのですよね?
> BeginSend は非同期的に送信を行う物で、送信が完了する前に処理を返します。
> ですので、この if 文が処理されるとき、別スレッドで送信処理を行っているところです。
> 当然、そのわずかな間に送信処理が完了することなどまずありません。
> ですから IsComleted などはまだ false です。
>
> 意味があるかどうかは実装者次第ですね。
> 送信完了まで放置するなら、呼び出し側が IAsyncResult を扱うことはあまりないかも知れません。
引用返信 編集キー/
■38986 / inTopicNo.4)  Re[3]: 非同期サーバーソケットのBeginSendについて
□投稿者/ Hongliang (439回)-(2009/07/28(Tue) 15:53:47)
> 送信の完了をもって処理を行いたい場合は、下記のような感じ問題ないでしょうか?
>
> private static ManualResetEvent sendDone = new ManualResetEvent(false);
>
> System.IAsyncResult Result = handler.BeginSend(sendBytes, 0, sendBytes.Length, 0, new AsyncCallback(OnSendMsg), socketPacket);
>
> sendDone.WaitOne();
>
> if(Result.IsCompleted)
> {
>  //成功時の処理
> }

問題があるか無いかと言われれば問題は無いように見えますが、
・WaitOne は完了まで無期限に待つのだから、WaitOne から処理が帰ってきた以上 IsCompleted を見る意味はない
・わざわざ ManualResetEvent を用意しなくても、IAsyncResult.AsyncWaitHandle を使えば待機可能
・呼び出し側が送信完了まで待つならそもそも BeginSend せず Send を呼べばいい
など、冗長なコードになっていますね。
引用返信 編集キー/
■39045 / inTopicNo.5)  Re[4]: 非同期サーバーソケットのBeginSendについて
□投稿者/ たろ (43回)-(2009/07/29(Wed) 18:22:31)

Hongliang さんご返信ありがとうございます。
確かに結果を待つなら非同期にする必要ないですねぇ。。

ご指摘ありがとうございました。


No38986 (Hongliang さん) に返信
>>送信の完了をもって処理を行いたい場合は、下記のような感じ問題ないでしょうか?
>>
>>private static ManualResetEvent sendDone = new ManualResetEvent(false);
>>
>>System.IAsyncResult Result = handler.BeginSend(sendBytes, 0, sendBytes.Length, 0, new AsyncCallback(OnSendMsg), socketPacket);
>>
>>sendDone.WaitOne();
>>
>>if(Result.IsCompleted)
>>{
>> //成功時の処理
>>}
>
> 問題があるか無いかと言われれば問題は無いように見えますが、
> ・WaitOne は完了まで無期限に待つのだから、WaitOne から処理が帰ってきた以上 IsCompleted を見る意味はない
> ・わざわざ ManualResetEvent を用意しなくても、IAsyncResult.AsyncWaitHandle を使えば待機可能
> ・呼び出し側が送信完了まで待つならそもそも BeginSend せず Send を呼べばいい
> など、冗長なコードになっていますね。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -