いつもお世話になっております。
今回、WebRequest.BeginGetResponse メソッド を利用して非同期でネットワークから画像データを取得し、それを既存のPanelクラスに貼り付けようとしています。
最初は安直にHandleEventを使用して既存クラスにコールバックしたのですが、Pictureboxを貼り付けるときに以下のExeptionが発生しました。
「別のスレッドで作成されたコントロールと対話するには、Control.Invoke を使用してください。」
そこでInvokeを使用して処理を渡してあげようとしたのですが、MSDNのリファレンスに
「.NET Compact Framework アプリケーションでは、デリゲートは EventHandler のインスタンスである必要があります。」
とありますが、EventHandlerを呼び出し元&コールバック先でどのように宣言して、それをDelegateクラスとしてInvokeをコールすればいいのかいまひとつ理解できません。以下のように試したのですが、コンパイルは通るのですがなかなかコールバック先に通知が届きません。
public event EventHandler ImageDownloaded; // 最初に実装したEventHandlerコールバック
public delegate void myMethodDelegate(object sender, EventArgs e); // EventHandlerのつもりのDelegate宣言
void RespCallback(IAsyncResult asynchronousResult) //
WebRequest.BeginGetResponse メソッド のサンプルのコールバック
{
try
{ ...
// Read the response into a Stream object.
Stream responseStream = myRequestState.response.GetResponseStream();
myRequestState.streamResponse = responseStream;
// 画像ファイルのときの処理
String str = myRequestState.response.ContentType.ToLower();
if (str.Contains("jpeg") || str.Contains("jpg"))
{
Delegate myDelegate = new myMethodDelegate(ImageDownloaded);
myRequestState.Invoke(myDelegate); // myRequestStateはサンプルではただのクラスですがInvokeを使用するのでControlクラスを継承しています
//ImageDownloaded(myRequestState, null); // 最初に試したHandleEventを使用したコールバック
return;
......
お分かりの方いましたら、ご教示いただければと思います。
よろしくお願いいたします。