110,533
社区成员
发帖
与我相关
我的任务
分享
public class test
{
public delegate void GetFlagHandler(int flag);
public event GetFlagHandler GetFlag;
public int flag; //如何获取你没有说,用这个变量代替
private Thread pro;
public test()
{
pro = new Thread(new ThreadStart(FlagTest));
pro.Start();
}
private void FlagTest()
{
while (true)
{
GetFlag(flag);
Thread.Sleep(1000);
}
}
public void Close()
{
while (pro.ThreadState == ThreadState.Running)
{
pro.Abort();
Thread.Sleep(100);
}
}
}
private void ts_GetFlag(int i)
{
if (i == 1)
{
warning()
}
else
{
Stop_warning()
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp2
{
class Program
{
private static CancellationTokenSource cts;
static void Main(string[] args)
{
using (Subject<int> source = new Subject<int>())
{
var source1 = source.AsObservable().Publish().RefCount();
source1.Subscribe(p =>
{
Console.WriteLine($"收到数据{p}");
});
source1.DistinctUntilChanged().Subscribe(async p =>
{
if (p == 1)
{
Console.WriteLine($"{p}到达,开始报警");
int i = 1;
Console.WriteLine($"---报警{i++}次");
source1.SkipWhile(c=>c==1).Buffer(10).Subscribe(c =>
{
Console.WriteLine($"报警{i++}次");
});
}
else if (p == 0)
{
Console.WriteLine($"{p}到达,停止报警");
}
});
//模拟数据
Task.Run(async () =>
{
source.OnNext(0);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(0);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(0);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(0);
await Task.Delay(TimeSpan.FromMilliseconds(200));
});
Console.ReadKey();
}
}
}
}
按你说的10次一来也不复杂,代码比较多,不过核心代码不多,主要是模拟构造数据麻烦点
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp2
{
class Program
{
private static CancellationTokenSource cts;
static void Main(string[] args)
{
using (Subject<int> source = new Subject<int>())
{
source.AsObservable().Subscribe(p =>
{
Console.WriteLine($"收到数据{p}");
});
source.AsObservable().DistinctUntilChanged().Subscribe(async p =>
{
if (p == 1)
{
Console.WriteLine($"{p}到达,启动报警");
cts = new CancellationTokenSource();
await alert(cts.Token);
}
else if (p == 0)
{
if (cts != null&&!cts.IsCancellationRequested)
{
Console.WriteLine($"{p}到达,停止报警");
cts.Cancel();
}
}
});
//模拟数据
Task.Run(async () =>
{
source.OnNext(0);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(0);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(0);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(1);
await Task.Delay(TimeSpan.FromMilliseconds(200));
source.OnNext(0);
await Task.Delay(TimeSpan.FromMilliseconds(200));
});
Console.ReadKey();
}
}
static async Task alert(CancellationToken token)
{
while (!token.IsCancellationRequested)
{
Console.WriteLine("报警中");
try
{
await Task.Delay(TimeSpan.FromMilliseconds(500), token);
}
catch (Exception e)
{
}
}
Console.WriteLine("报警已取消");
}
}
}
来个rx版的把,你能不能接受那就看你自己了。