gpt4 book ai didi

c# - 在 C# .net 中创建两个任务并在特定时间段后关闭其中一个

转载 作者:行者123 更新时间:2023-11-30 20:52:09 31 4
gpt4 key购买 nike

我有一个方法有时需要一分多钟才能执行。我想创建一个任务来监视执行此方法所需的时间。如果该方法在 2 分钟内执行,我应该返回第一个任务的输出,否则我应该抛出异常。我使用的是 .net framework 4.0 和 C# 作为语言。

我不能使用 Microsoft Reactive Extensions在这种情况下,因为它释放了主线程。在发生以下情况之前,我不想释放主线程

  1. 超时
  2. 返回数据
  3. 发生任何其他异常

请提供您的建议。

最佳答案

理想情况下,您应该将 CancellationTokenSource 与超时一起使用,并在您的方法中观察其 CancellationToken。如果那不可能,您可以使用 Task.WhenAnyMethodAsync 的以下实现应该适合您的 .NET 4.0 方案:

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp
{
class Program
{
// the method to monitor and timeout
int Method()
{
Thread.Sleep(3000); // sleep for 3s
return 42;
}

Task<int> MethodAsync(int timeout)
{
// start the Method task
var task1 = Task.Run(() => Method());

// start the timeout task
var task2 = Task.Delay(timeout);

// either task1 or task2
return Task.WhenAny(task1, task2).ContinueWith((task) =>
{
if (task.Result == task1)
return task1.Result;
throw new TaskCanceledException();
});
}

// The entry of the console app
static void Main(string[] args)
{
try
{
// timeout in 6s
int result = new Program().MethodAsync(6000).Result;
Console.WriteLine("Result: " + result);
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
Console.WriteLine("Hit enter to exit.");
Console.ReadLine();
}
}
}

下面是使用 async/awaitMethodAsync 版本,如果你可以使用 Microsoft.Bcl.Async :

async Task<int> MethodAsync(int timeout)
{
// start the Method task
var task1 = Task.Run(() => Method());

// start the timeout task
var task2 = Task.Delay(timeout);

// either task1 or task2
var task = await TaskEx.WhenAny(task1, task2);
if (task == task1)
return task1.Result;

throw new TaskCanceledException();
}

关于c# - 在 C# .net 中创建两个任务并在特定时间段后关闭其中一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21185399/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com