C#中的状态机
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#中的状态机,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1979字,纯文字阅读大概需要3分钟。
内容图文
我正在尝试弄清楚这段代码发生了什么.我有两个线程迭代范围,我试图了解第二个线程调用GetEnumerator()时发生了什么.特别是这一行(T current = start;),似乎是由第二个线程在这个方法中产生一个新的’实例’.
看到DateRange类只有一个实例,我试图理解为什么第二个线程没有捕获第一个线程修改的“当前”变量.
class Program {
static void Main(string[] args) {
var daterange = new DateRange(DateTime.Now, DateTime.Now.AddDays(10), new TimeSpan(24, 0, 0));
var ts1 = new ThreadStart(delegate {
foreach (var date in daterange) {
Console.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " " + date);
}
});
var ts2 = new ThreadStart(delegate {
foreach (var date in daterange) {
Console.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " " + date);
}
});
Thread t1 = new Thread(ts1);
Thread t2 = new Thread(ts2);
t1.Start();
Thread.Sleep(4000);
t2.Start();
Console.Read();
}
}
public class DateRange : Range<DateTime> {
public DateTime Start { get; private set; }
public DateTime End { get; private set; }
public TimeSpan SkipValue { get; private set; }
public DateRange(DateTime start, DateTime end, TimeSpan skip) : base(start, end) {
SkipValue = skip;
}
public override DateTime GetNextElement(DateTime current) {
return current.Add(SkipValue);
}
}
public abstract class Range<T> : IEnumerable<T> where T : IComparable<T> {
readonly T start;
readonly T end;
public Range(T start, T end) {
if (start.CompareTo(end) > 0)
throw new ArgumentException("Start value greater than end value");
this.start = start;
this.end = end;
}
public abstract T GetNextElement(T currentElement);
public IEnumerator<T> GetEnumerator() {
T current = start;
do {
Thread.Sleep(1000);
yield return current;
current = GetNextElement(current);
} while (current.CompareTo(end) < 1);
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
return GetEnumerator();
}
}
解决方法:
他们都使用相同的IEnumerable<T>,但不同的IEnumerator<T>.每次输入带有IEnumerable的for each in循环时,都会调用GetEnumerator,返回一个具有自己状态的独立IEnumerator.
内容总结
以上是互联网集市为您收集整理的C#中的状态机全部内容,希望文章能够帮你解决C#中的状态机所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。