我编写了一个Timer类,以便在轮询另一个系统的Windows服务中使用它.我这样做是因为我有两个问题System.Timers.Timer没有解决.
System.Timers.Timer.Stop函数阻止主线程,直到Elapsed EventHanler的执行结束.System.Timers.Timer不处理事件再入.我希望Interval介于两个Elapsed EventHanler之间,这样如果之前的调用(+ interval)还没有完成,Timer就不会调用Elapsed EventHanler.在编写课程时,我发现我需要解决一些与thrading相关的问题,因为我不太熟悉那些我想知道以下Timer类是否是线程安全的?
public class Timer
{
System.Timers.Timer timer = new System.Timers.Timer() { AutoReset = false };
ManualResetEvent busy = new ManualResetEvent(true);
public double Interval
{
get { return timer.Interval; }
set { timer.Interval = value; }
}
public Timer()
{
timer.Elapsed += new ElapsedEventHandler(TimerElapsed);
}
void TimerElapsed(object sender, ElapsedEventArgs e)
{
try
{
busy.Reset();
OnElapsed(e);
timer.Start();
}
finally
{
busy.Set();
}
}
public event EventHandler Elapsed;
protected void …Run Code Online (Sandbox Code Playgroud) 所以,我的朋友今天早上给我发了一个谜题:
查找一天中不同时间的数量(使用24小时显示并假设早晨时间显示为8:15而不是08:15),其中段的数量等于数字的总和.例如.8:15电子格式有7 + 2 + 5 = 14段,数字之和为8 + 1 + 5 = 14,因此符合条件.
所以我在C#3.0中提出了以下简单(但是迟钝的暴力)解决方案:
// Number of segments in each digit
var digitMap =
new Dictionary<char, int>
{
{'0',6},{'1',2},{'2',5},{'3',5},{'4',4},
{'5',5},{'6',5},{'7',3},{'8',7},{'9',5}
};
var numMatches = (
from h in Enumerable.Range(0,24)
from m in Enumerable.Range(0,60)
select h.ToString() + m.ToString().PadLeft(2,'0') into t
let chars = t.ToCharArray()
where chars.Sum(c => int.Parse(c.ToString())) == chars.Sum(c => digitMap[c])
select t).Count();
Run Code Online (Sandbox Code Playgroud)
但是,他补充说:
不允许使用蛮力方法.
我已经考虑了一段时间了,我正在努力想出一个更聪明的算法.我正落预滤波的不可能性的路径(例如倍,其中的数字的总和是小于6,因为这是最小段总和) - 但最终我假定只会导致更小的解空间,然后是暴力强迫.
无论如何,我认为把它扔出去是一个有趣的问题,看看是否有人能想出一个更聪明的方法.
有没有用C#编写的开源C#编译器?
我知道Blue,但它是在2001年写的,只支持C#1:
理想情况下,我正在寻找一个支持C#3.0的 - 但即使2.0也没关系.
我们知道如果我们为列表声明泛型类型,我们可以在列表中添加字符串和整数.但代码似乎没有添加字符串.有什么问题我无法理解..
class GHJ{String s;GHJ(String s){this.s=s;}}
class DFR{
public static void main(String[] g){
List<? extends Object> list=new ArrayList();
list.add((new String("ffg")));// compiler error
list.add("df");// compiler error
list.add("sdd");// compiler error
list.add(new GHJ("dff"));// compiler error
String s= list.get(0);// compiler error
System.out.println(list+" "+s);
}
}
Run Code Online (Sandbox Code Playgroud)