- PR -

非同期メソッドの停止破棄

1
投稿者投稿内容
ポテチ
ベテラン
会議室デビュー日: 2003/03/28
投稿数: 69
投稿日時: 2003-12-13 12:55
こんにちは。
コールバックメソッドを使って外部のデバイスに対してポーリングする必要があり、
自フォームからBeginInvokeを使ってPollingメソッドを呼び出してます。
そのメソッドの処理が完了した後、コールバックメソッドを呼び出しEndInvokeによって
値を取得しておりますが、あるケースでフォームのボタンをクリックし、実行中のPollingメソッドの処理を停止させる必要が出てきましたがどのようにすれば実現できるのでしょうか?

#単純にIAsyncResultをグローバル変数にして停止ボタンでIsCompletedプロパティにTrueを入れればいいと考えたのですがgetプロパティでしたのでだめでした。
いい方法があったら教えてください。よろしくお願いします。

ポーリングクラス

using System;
public class AsyncronousCall
{
public AsyncronousCall()
{
}
public bool polling(int param1, int param2, ref int param3)
{

// 重い処理
for(int i = 0; i < 10; i++)
{
Console.WriteLine(i);
System.Threading.Thread.Sleep(1000);
}
param3 = param1 * param2;
return true;
}
}

以下フォームから抜粋

static IAsyncResult p_ar;
private void btnStart_Click(object sender, System.EventArgs e)
{
// 非同期で呼び出すメソッド(AsyncronousCall) のデリゲートを作ります。
AsyncronousCall ap = new AsyncronousCall();
asyncCall = new MyDelegate(ap.polling);

// 適当なパラメータを渡します。
int param1 = 123;
int param2 = 0;
int param3 = 0;

System.AsyncCallback ac = new System.AsyncCallback( MyAsyncCallback );
p_ar = asyncCall.BeginInvoke(param1, param2, ref param3, ac, null);
}

public delegate bool MyDelegate(
int param1,
int param2,
ref int param3);

MyDelegate asyncCall;

public void MyAsyncCallback(IAsyncResult ar)
{
// EndInvoke で結果を取り出す。
MyDelegate asyncCall =
(MyDelegate) ((System.Runtime.Remoting.Messaging.AsyncResult)ar).AsyncDelegate;
int param3 = 0;
bool result = asyncCall.EndInvoke(ref param3, ar);

Console.WriteLine("MyAsyncCallback: param3: {0}, bool: {1}", param3, result);
}
1

スキルアップ/キャリアアップ(JOB@IT)