C# 在特定时间间隔内调用方法
我需要在特定的时间间隔内运行一个方法。如何通过c实现它# 我写了一段代码,但没有重复。它只执行一次。 谁能给我解释一下什么是可观察的和可取消的标记。如何使用它C# 在特定时间间隔内调用方法,c#,observable,system.reactive,C#,Observable,System.reactive,我需要在特定的时间间隔内运行一个方法。如何通过c实现它# 我写了一段代码,但没有重复。它只执行一次。 谁能给我解释一下什么是可观察的和可取消的标记。如何使用它 IObservable<long> observable = Observable.Interval(TimeSpan.FromHours(1)); System.Threading.CancellationTokenSource source = new System.Threading.CancellationTokenS
IObservable<long> observable = Observable.Interval(TimeSpan.FromHours(1));
System.Threading.CancellationTokenSource source = new System.Threading.CancellationTokenSource();
observable.Subscribe(x =>
{
System.Threading.Tasks.Task task = sampleMethod();
task.Start();
}, source.Token);
IObservable-observable=可观测间隔(TimeSpan.FromHours(1));
System.Threading.CancellationTokenSource=新的System.Threading.CancellationTokenSource();
可观察。订阅(x=>
{
System.Threading.Tasks.Task任务=sampleMethod();
task.Start();
},source.Token);
可观察的时间间隔(TimeSpan.FromHours(1))。选择many(=>sampleMethod())。Subscribe()
。忽略瞬间取消行为(很容易添加),只需将间隔
正确地映射到表示为任务
的异步例程(内部视为IObservable
,顺便说一句,有.ToObservable()
扩展方法来转换任务
)。请注意,SelectMany(…)
在这里至关重要:否则,Rx框架将不会等待任务完成,不会捕获可能的异常,也不会保留事件的原始顺序
CancellationToken
用于取消订阅您制作的observeable
。它类似于IDisposable
,在这个意义上,两者都有相同的目标:停止并清理订阅。因此,一旦对其调用Cancel()
,就不会得到任何更新
另外,您确定FromHours(1)的正确吗?您可能需要更短的时间间隔,例如从分钟数(1)
开始 可观察。间隔(TimeSpan.FromHours(1))。选择many(=>sampleMethod())。Subscribe()
。忽略瞬间取消行为(很容易添加),只需将间隔
正确地映射到表示为任务
的异步例程(内部视为IObservable
,顺便说一句,有.ToObservable()
扩展方法来转换任务
)。请注意,SelectMany(…)
在这里至关重要:否则,Rx框架将不会等待任务完成,不会捕获可能的异常,也不会保留事件的原始顺序
CancellationToken
用于取消订阅您制作的observeable
。它类似于IDisposable
,在这个意义上,两者都有相同的目标:停止并清理订阅。因此,一旦对其调用Cancel()
,就不会得到任何更新
另外,您确定FromHours(1)的
正确吗?您可能需要更短的时间间隔,例如从分钟数(1)
开始 您可以通过多种方式实现这一点。最简单的方法之一是这样:
public async Task RunScheduleJob(CancellationToken token)
{
while(!token.IsCancellationRequest)
{
YourMethod();
await Task.Delay(TimeSpan.FromHours(1), token)
}
}
另外,对于这样一个简单的工作,您不需要使用被动扩展或任何其他外部库。您可以通过玩弄
任务
实例来实现它您可以通过多种方式实现。最简单的方法之一是这样:
public async Task RunScheduleJob(CancellationToken token)
{
while(!token.IsCancellationRequest)
{
YourMethod();
await Task.Delay(TimeSpan.FromHours(1), token)
}
}
另外,对于这样一个简单的工作,您不需要使用被动扩展或任何其他外部库。您只需使用
任务
实例就可以实现这一点,如果您只需要定时器功能,则无需使用Rx。您只需使用系统中的计时器即可。线程处理:
var timer = new Timer(_ =>
{
// repeating code goes here
// the argument is an optional state that you can pass into the constructor
});
timer.Change( dueTime: TimeSpan.FromSeconds(1), period: TimeSpan.FromSeconds(0.1));
// run your app
timer.Dispose();
计时器的优点是,它允许您随时重新配置它(如果您想更改周期,只需再次调用Change
),暂时禁用它并将其清除(调用Dispose)。如果您只需要计时器功能,则无需Rx。您只需使用系统中的计时器即可。线程处理:
var timer = new Timer(_ =>
{
// repeating code goes here
// the argument is an optional state that you can pass into the constructor
});
timer.Change( dueTime: TimeSpan.FromSeconds(1), period: TimeSpan.FromSeconds(0.1));
// run your app
timer.Dispose();
计时器的优点是,它允许您随时重新配置它(如果您想更改周期,只需再次调用Change
),暂时禁用它并将其清除(调用Dispose)。Rx是处理这种情况的一种非常好的方法。它非常干净
问题中最基本的代码重写如下:
IObservable<Unit> observable =
from i in Observable.Interval(TimeSpan.FromHours(1))
from t in Observable.FromAsync(() => sampleMethod())
select t;
IDisposable subscription = observable.Subscribe();
唯一的区别是fromsync
调用将CancellationToken
传递给sampleMethod
调用,当您调用subscription.Dispose()
时,该调用将被取消。它非常干净
问题中最基本的代码重写如下:
IObservable<Unit> observable =
from i in Observable.Interval(TimeSpan.FromHours(1))
from t in Observable.FromAsync(() => sampleMethod())
select t;
IDisposable subscription = observable.Subscribe();
唯一的区别是fromsync
调用将CancellationToken
传递给sampleMethod
调用,该调用将在调用subscription.Dispose()时取消
一个澄清:您是否正在寻找在重复间隔中调用方法的最简单方法,并且意外地发现了这个IObservable
示例,或者您实际上想要使用IObservable
?如果您按照计划运行某项任务,我会尝试让操作系统使用其本机工具来运行任务(例如,Windows的任务计划程序).如果有更好的解决方案,你能告诉我什么时候使用IObservable
@Groo@Iceberg-对于这种情况,使用IObservable
是理想的。这是一种非常干净的编码方式。@EnigmativityIObservable
将如何工作?需要澄清的是:您是否正在寻找在重复中调用方法的最简单方式tervals和您意外地发现了这个IObservable
示例,或者您实际上想要使用IObservable
?如果您正在按计划运行某些内容,我会尝试让操作系统使用其本机工具(例如Windows的任务计划程序)运行任务.如果有更好的解决方案,你能告诉我什么时候使用IObservable
@Groo@Iceberg-对于这种情况,使用IObservable
是理想的。它可以是一种超级干净的编码方式。@Enigmativity Ho