私は1つの方法でUploader
クラスを持っている - Upload
キャンセル非同期アップロードタスク
public static int Upload(string endpoint,object objectToBeUploaded)
{
Source.Token.ThrowIfCancellationRequested();
var repos = new UploadRepository(endpoint);
return repos.Upload(objectToBeUploaded);
}
Source
は、プロジェクトで利用できる静的CancellationTokenSource
です。
また、アップロードする必要があるエンドポイントのリストがあります。object
。
Form
のコードは、(それがWinForms
を使用して、非常に小さなプロジェクトだ)次のようになります。
private async Task UploadObjectAsync(
string endpoint,
object objectToBeUploaded)
{
try
{
int elementId = await Task.Factory.StartNew(
() => Uploader.Upload(endpoint,objectToBeUploaded));
//do something with the returned value..
}
catch(OperationCanceledEception ex)
{
//handle the exception..
}
}
そして私はので、私は後でそれを使用することができ、このようなbtnUpload.Click
ハンドラを設定します。
this.btnUpload.Click += async (s, e) =>
{
foreach(var endpoint in endpoints)
{
await UploadObjectASsync(endpoint,someObject);
}
}
問題は、すべてのエンドポイントにアップロードを開始するとき(取得方法とは無関係)、を使用してアップロードプロセスをキャンセルすることにしたとき、最初のUploadObjectAsync
はUpload
の方法が既に渡されているため、 Source.Token.ThrowIfCancellationRequested();
のチェックが行われてから経過しています。残りのタスクは正常にキャンセルされ、正常に処理されます。
最初のUploadObjectAsync
Task
もキャンセルされるように、このコードを再構成する方法を教えてください。
私はUpload
メソッドのrepos.Upload(objectToBeUploaded)
というアップロードプロセス自体(サービス参照)のソースコードにもアクセスできません。
実際にはアドバイスされていません。 –
ええと...スレッドを中断するのは比較的安全です。 – Nitram
うん。アップロードコードは変更する必要があります。それが彼の支配から外れていれば、これは行く方法でしょう。 –