过早中止 BeginRead 和 BeginWrite 的正确方法是使用 CancellationToken 进行异步操作的取消。
CancellationToken 是一个用于协调取消操作的对象,可以在异步操作中使用它来检查操作是否被取消,并在操作被取消时抛出异常。
在 BeginRead 和 BeginWrite 方法中,可以使用 CancellationToken 作为参数传递给它们,以便在操作被取消时能够正确地处理异常。
例如,以下代码演示了如何使用 CancellationToken 来取消 BeginRead 操作:
using System;
using System.IO;
using System.Threading;
class Program
{
static void Main(string[] args)
{
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
// 启动异步操作
FileStream fs = new FileStream("test.txt", FileMode.Open);
byte[] buffer = new byte[1024];
IAsyncResult result = fs.BeginRead(buffer, 0, buffer.Length, null, null);
// 取消操作
cts.Cancel();
try
{
// 等待操作完成
fs.EndRead(result);
}
catch (OperationCanceledException ex)
{
Console.WriteLine("操作被取消:{0}", ex.Message);
}
finally
{
fs.Close();
}
}
}
在上面的代码中,我们首先创建了一个 CancellationTokenSource 对象,然后使用它来创建一个 CancellationToken 对象。接着,我们使用 BeginRead 方法启动异步操作,并将 CancellationToken 作为参数传递给它。然后,我们使用 CancellationTokenSource 的 Cancel 方法取消操作,并在 EndRead 方法中捕获 OperationCanceledException 异常,以确保操作被正确地取消。
同样,在 BeginWrite 方法中,我们也可以使用 CancellationToken 来取消操作。例如:
using System;
using System.IO;
using System.Threading;
class Program
{
static void Main(string[] args)
{
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
// 启动异步操作
FileStream fs = new FileStream("test.txt", FileMode.Open);
byte[] buffer = new byte[1024];
IAsyncResult result = fs.BeginWrite(buffer, 0, buffer.Length, null, null);
// 取消操作
cts.Cancel();
try
{
// 等待操作完成
fs.EndWrite(result);
}
catch (OperationCanceledException ex)
{
Console.WriteLine("操作被取消:{0}", ex.Message);
}
finally
{
fs.Close();
}
}
}
在上面的代码中,我们使用 BeginWrite 方法启动异步操作,并将 CancellationToken 作为参数传递给它。然后,我们使用 CancellationTokenSource 的 Cancel 方法取消操作,并在 EndWrite 方法中捕获 OperationCanceledException 异常,以确保操作被正确地取消。
总之,要过早中止 BeginRead 和 BeginWrite 的正确方法是使用 CancellationToken 进行异步操作的取消。这样可以确保操作被正确地取消,并且可以避免不必要的资源浪费。
领取专属 10元无门槛券
手把手带您无忧上云