私は非同期待機操作を学んでおり、非常に役立つ記事を見つけました。
この記事の最後のコード スニペットを検討します。
public async Task ProcessWriteMult(CancellationToken cancellationToken)
{
string folder = @"tempfolder\";
List<Task> tasks = new List<Task>();
List<FileStream> sourceStreams = new List<FileStream>();
try
{
for (int index = 1; index <= 10; index++)
{
string text = "In file " + index.ToString() + "\r\n";
string fileName = "thefile" + index.ToString("00") + ".txt";
string filePath = folder + fileName;
byte[] encodedText = Encoding.Unicode.GetBytes(text);
FileStream sourceStream = new FileStream(filePath,
FileMode.Append, FileAccess.Write, FileShare.None,
bufferSize: 4096, useAsync: true);
Task theTask = sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
sourceStreams.Add(sourceStream);
tasks.Add(theTask);
}
await Task.WhenAll(tasks);
}
finally
{
foreach (FileStream sourceStream in sourceStreams)
{
sourceStream.Close();
}
}
}
タスクをキャンセルするコードをいくつか試しましたが、私見ですが、これらは非常に醜い試みです。この試みでは、プログラムフローはユーザーがキーを押すのを待ちますが、イベントのように、ユーザーが Esc ボタンを押すまでこのコードを機能させたいと思います:
if(Console.ReadKey().Key==System.ConsoleKey.Escape)
cts.Cancel();
Escape キーで適切にキャンセルするにはどうすればよいですか?
アップデート:
このコードを挿入しました:
static void Main(string[] args)
{
var cts=new CancellationTokenSource();
ProcessWriteMult(cts);
if(Console.ReadKey().Key == System.ConsoleKey.Escape)
cts.Cancel();
}
ただし、このコードは method をキャンセルしませんProcessWriteMult(cts)
。私は何を間違っていますか?