在C# windows应用程序中:
1.每1秒钟检测一个状态flag,如果flag=1,则执行函数warning()(需要10秒钟),这样的话就会产生操作积压,请问应该如何处理呢??
2.我的需求是持续监测flag,如果一直是flag=1,就持续执行warning(),比如检测了10次flag都是1,只执行一次warning(),检测了20次flag都是1,只执行两次warning(),当然如果检测到flag是0,则立即停止执行warning(),请问我该怎么做呢?
3.也就是说前台检测某个状态flag,如果一直是1,持续warning(),如果是0,则停止。
1.每1秒钟检测一个状态flag,如果flag=1,则执行函数warning()(需要10秒钟),这样的话就会产生操作积压,请问应该如何处理呢??
2.我的需求是持续监测flag,如果一直是flag=1,就持续执行warning(),比如检测了10次flag都是1,只执行一次warning(),检测了20次flag都是1,只执行两次warning(),当然如果检测到flag是0,则立即停止执行warning(),请问我该怎么做呢?
3.也就是说前台检测某个状态flag,如果一直是1,持续warning(),如果是0,则停止。
解决方案 »
- 关于Lambda
- [wcf]RaisePropertyChanged的信息如何在服务端获取
- 快来吧,一个计算机图形+数学的比较困难的问题
- C#数据导出到Excel问题
- 原因分析及解决方案:执行一次数据需要半个多小时????????
- 急急急!!!!!!!!!!!!!!
- .Net里有没有类似Java中StringToken的类?
- 为什么我用这几条语句完成jpg图片缩小操作后,很模糊,用什么方法才好?
- readonly的疑惑
- 如何传送一个自定义类到XML WebServer 上的方法中。
- c#使用Hangfire连接Redis服务器,数据一直暴增的问题
- DevExpress GridControl控件获取选中多行的索引
using System;
using System.Runtime.InteropServices;
class test
{
[DllImport("kernel32.dll")]
private static extern int Beep(int dwFreq ,int dwDuration) ; public static void Main()
{
int a=0X7FF;
int b=1000;
Beep(a,b);
}
}第二种方法:http://msdn.microsoft.com/zh-cn/library/4fe3hdb1(VS.85).aspx
那就FI(FLAG==1) a++
warning() 是根据A的 次数来的 每次10秒结束后 a-- 具体 逻辑要看你自己 这个和代码没关系吧
if(xxx!=value)
//触发事件
}
}
触发事件处理()
{
if(报警)
{
正在报警,忽略。让他自己循环去
没报警就报警
}
else
{
直接停止报警(这里如果是CancelTokenSource 就直接 CancelTokenSource?.cancel() 就好)
}
}ps:rx.net做这个简单,不过嘛rxnet不是受天朝neter欢迎的东西(话说人家天朝js,安卓,ios,pyton,go都能理解rx,为啥天朝neter接受这玩意就这么困难呢)
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版的把,你能不能接受那就看你自己了。
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次一来也不复杂,代码比较多,不过核心代码不多,主要是模拟构造数据麻烦点
System.Threading.SemaphoreSlim _slim=new SemaphoreSlim(1,1);
if (_slim.CurrentCount == 0)
{
return; //前面的没做完,直接忽略
}
await _slim.WaitAsync();
报警();
_slim.Release();
新建一个类
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);
}
}
}主线程中:
test ts;ts = new test();
ts.GetFlag+=new test.GetFlagHandler(ts_GetFlag);写 ts_GetFlag函数
private void ts_GetFlag(int i)
{
if (i == 1)
{
warning()
}
else
{
Stop_warning()
}
}