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

我需要在特定的时间间隔内运行一个方法。如何通过c实现它#

我写了一段代码,但没有重复。它只执行一次。 谁能给我解释一下什么是可观察的和可取消的标记。如何使用它

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
是理想的。这是一种非常干净的编码方式。@Enigmativity
IObservable
将如何工作?需要澄清的是:您是否正在寻找在重复中调用方法的最简单方式tervals和您意外地发现了这个
IObservable
示例,或者您实际上想要使用
IObservable
?如果您正在按计划运行某些内容,我会尝试让操作系统使用其本机工具(例如Windows的任务计划程序)运行任务.如果有更好的解决方案,你能告诉我什么时候使用
IObservable
@Groo@Iceberg-对于这种情况,使用
IObservable
是理想的。它可以是一种超级干净的编码方式。@Enigmativity Ho