gpt4 book ai didi

c# - 如何暂停任务执行

转载 作者:行者123 更新时间:2023-12-03 19:23:22 26 4
gpt4 key购买 nike

我有创建任务的代码:

 Task.Factory.StartNew(() =>
{
ExtractStuff(fileName);
});

有时我需要在 ExtractStuff 中暂停几秒钟

可以使用常规的 Thread.Sleep(1000) 吗?或者有其他方法可以暂停正在运行的任务吗?

最佳答案

Thread.Sleep 会阻塞运行 Task 的线程(这并不理想),但只要您不运行大量任务并行。 .NET 4.5 对“async/await”和 Task.Delay 进行了一些改进,这些改进将基于计时器隐式设置一个延续(不需要阻塞正在运行的线程),但这在 4.0 中不直接可用。

你可以用这样的东西自己做同样的事情(没有经过太多测试,所以谨慎使用):

class Program
{
static void Main(string[] args)
{
var fullAction = RunActionsWithDelay(DoSomething, 2000, DoSomethingElse);
fullAction.Wait();
Console.WriteLine("Done");
Console.ReadLine();
}

static Task RunActionsWithDelay(Action first, int delay, Action second)
{
var delayedCompletion = new TaskCompletionSource<object>();
var task = Task.Factory.StartNew(DoSomething);
task.ContinueWith(t =>
{
if (t.IsFaulted)
{
delayedCompletion.SetException(t.Exception);
}
else
{
Timer timer = null;
timer = new Timer(s =>
{
try
{
DoSomethingElse();
delayedCompletion.SetResult(null);
}
catch (Exception ex)
{
delayedCompletion.SetException(ex);
}
finally
{
timer.Dispose();
}
}, null, delay, Timeout.Infinite);
}

});
return delayedCompletion.Task;
}

static void DoSomething()
{
Console.WriteLine("Something");
}

static void DoSomethingElse()
{
Console.WriteLine("Something Else");
}
}

虽然你可以比上面的更好地封装它,但它相当丑陋。它确实消除了“挂起”线程,但是设置延续会带来额外的性能开销。如果您有很多并行任务在运行并且它们都需要引入延迟,我真的只建议这样做。

关于c# - 如何暂停任务执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12081258/

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