2010-11-23 17 views
1

イベントStatusChanged & ProgressChangedで進行状況を示す要求データをアップロードするGetResponseStream()を持つHttpHelperクラスがあるとします。機能非同期/非ブロック化の方法に関するガイダンスが必要

public MemoryStream GetResponseStream() { 
    ... 
    Status = Statuses.Uploading; // this doesn't raise StatusChanged 
    // write to request stream 
    ... // as I write to stream, ProgressChanged doesn't get raised too 
    Status = Statuses.Downloading; // this too 
    // write to response stream 
    ... // same here 
    Status = Statuses.Idle; // this runs ok. Event triggered, UI updated 
} 

コード@pastebinGetRequestStream()を使用してクラスを呼び出していた場合、クラス自体はうまく動作します。

次にクラス自体は動作しますが、イベント育てられていないようです。私はそれがブロックされているUIスレッドと関係していると思う。 _dispatcher & Taskのすべてのものを使用することなく、使用するクラスのためのより簡単な/クリーナーがそれを使用するように、クラスをどのように再コード化することができますか?

また、私はイベント/ UIが更新されない原因を確かに知りたいと思います。コードが同期していても、変更されたプロパティ/イベントを実行することはできません。

+0

PasteBin構文の強調表示をC#に設定する必要があります。 http://pastebin.com/FeAPB6rU – SLaks

+0

@SLaks、私に通知してくれてありがとう、PHP yestをやっていて、言語を変更するのを忘れていたに違いない。 –

答えて

2

自分で手作りする代わりに、BackgroundWorkerを調べてみる必要があります。 ReportProgressを使用して、処理の状態をUIスレッドに渡します。

+1

これはおそらくこの質問の良い提案ですが、これはあまりうまくいかないシナリオがあるためです:この提案の問題は、作業が進行中であればスレッドを消費することになります。クライアント側のコードで問題になることはまずありませんが(これは疑問です)、サーバー側のコードでは非同期的な処理を打ち負かしてしまいます。ネットワーキング・クラスをフル・オン・アシンクで使用すると、スレッドをより慎重に使用できるようになり、時にはサーバーのスケーラビリティーに役立ちます。 (しかし、ここで大胆になるだろう。) –

+0

+1イアンコメント。 –

関連する問題