Учитывая следующее:Как отменить запрос FileStream.ReadAsync (...)?
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace CancelAsyncFileReadFailure {
class Program {
static void Main(string[ ] args) {
Console.WriteLine(Foo().Result);
Console.ReadLine();
}
public static async Task<TaskStatus> Foo() {
byte[] bar = new byte[192000]; //Some arbitrarily significant number...
using (FileStream FS = new FileSTream(@"Path/To/WarAndPeace.txt", FileMode.Open)){
CancellationTokenSource CTS = new CancellationTokenSource();
Task T = FS.ReadAsync(bar, 0, 192000, CTS.Token);
CTS.Cancel();
await T;
return T.Status;
}
}
T
будет всегда закончить и вернуться RanToCompletion
.
Мой пример использования несколько более сложный, поскольку я читаю с устройства, которое может быть открыто или закрыто в любое время (и как таковое я не читаю непосредственно из файла, а из файла безопасного файла, однако результаты одинаковы как в этом случае, так и в моем фактическом использовании).
Я хочу прервать (отменить) FileStream.ReadToAsync().
Как я могу сделать это так, чтобы он прекратил читать, где он находится, и отменил его прямо сейчас?
'CancellationTokenSource' необходимо настроить вне функции, [проверить это] (https://msdn.microsoft.com/en-us/library/jj155759.aspx) – balexandre
@balexandre: Пожалуйста, уточните. Вы имеете в виду, что мне нужно объявить его вне функции (как переменную класса) или что мне нужно вызвать 'CancellationTokenSource.Token.Register (() => {})' что-то? – Will
Я не вижу неправильного использования 'CancellationTokenSource' здесь. –