私は次のコードを持っています:
void ReferenceManager_DoWork(object sender, DoWorkEventArgs e)
{
try
{
// Get the raw data
byte[] data = this.GetData(IvdSession.Instance.Company.Description, IvdSession.Instance.Company.Password);
// Deserialize the list
List<T> deseriaizedList = null;
using (MemoryStream ms = new MemoryStream(data))
{
deseriaizedList = Serializer.Deserialize<List<T>>(ms);
}
// Convert the list to the Reference Interface
List<IReference> referenceList = new List<IReference>();
foreach (T entity in deseriaizedList)
{
IReference reference = (IReference)entity;
referenceList.Add(reference);
}
e.Result = referenceList;
}
catch (WebException)
{
e.Result = null;
}
}
このコードは基本的に、WebService メソッドへのデリゲートを呼び出しています。残念ながら、バックグラウンド ワーカーを使用した主な理由は、データの読み込み時に UI がフリーズするのを防ぐことでした。「お待ちください。キャンセルするにはここをクリックしてください」というポップアップ フォームがあります。
キャンセルをクリックすると、バックグラウンド ワーカーで CancelAsync を呼び出します。今、私はループしていないので、キャンセルを確認する良い方法がわかりません。私が見ることができる唯一のオプションは...
byte[] m_CurrentData;
...メソッドの外側で、Web サービスを呼び出して m_CurrentData を設定する DoWork(..) の開始時に新しいスレッドを起動します。次に、キャンセルされたかどうかをチェックするループを実行するか、m_CurrentData が null ではないかどうかをチェックする必要があります。
キャンセルを達成するためのより良い方法はありますか?