gpt4 book ai didi

c# - 使用 .Net 在计时器上运行 Func

转载 作者:行者123 更新时间:2023-12-04 10:52:06 25 4
gpt4 key购买 nike

我这样做是作为一种学习练习,可以在一些帮助下完成。

目标是使用 C# 在 Timer 滴答上执行 Func<>。
定时器被抽象为另一个方法,但需要从主函数访问 Action 的返回值。

考虑以下代码...

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

namespace actionexample
{
class Program
{
static void Main(string[] args)
{
Func<string, string, Task> testFunc = async (f, n) =>
{
Console.WriteLine("Starting Action");
f += n;
Console.WriteLine(f);
await Task.Delay(100);
};

SubscribeToConfigAsync<string>("1", "2", testFunc);

Console.Write("END");
Console.ReadLine();
}

static void SubscribeToConfigAsync<T>(string feature, string name, Func<string, string, Task> action)
{
var timer = new Timer(5000);
timer.Elapsed += async (sender, e) => await action(feature, name);
timer.Start();
}

}
}

我想在计时器打勾后访问 Main() 中的 Func<> 生成的值,但不确定如何执行此操作?

我似乎无法让这个工作,任何帮助将不胜感激。

最佳答案

我不清楚您在这里的总体目标是什么,但您应该使用 Microsoft 的响应式(Reactive)框架(又名 Rx) - NuGet System.Reactive并添加 using System.Reactive.Linq; - 它会让你的代码变得更加简单。尝试这个:

Func<string, string, string> testFunc = (f, n) =>
{
Console.WriteLine("Starting Action");
return f + n;
};

Observable
.Interval(TimeSpan.FromSeconds(5.0))
.Select(x => testFunc("1", "2"))
.Subscribe(x => Console.WriteLine(x));

Console.Write("END");
Console.ReadLine();

这就是您当前问题中的代码所做的。

假设我想做一些更有趣的事情 - 假设我将从 0 创建一个数字序列至 4 , 生产于 1第二个间隔,我想连接每个数字以形成一个序列 0 , 01 , 012 , 0123 , 01234然后停止。就是这样:
var last_result =
Observable
.Interval(TimeSpan.FromSeconds(1.0))
.Take(5)
.Scan("", (a, x) => a + x.ToString())
.Do(z => Console.WriteLine(z))
.Wait();

Console.WriteLine("The last result was: " + last_result);
Console.WriteLine("END");

这会在控制台中产生:

0
01
012
0123
01234
最后的结果是:01234
结尾

关于c# - 使用 .Net 在计时器上运行 Func<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59431971/

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