这是我的情景:
ClassA
{
Timer tmr = new Timer(1000);
void Start()
{
tmr.start();
}
void tmr_Elapsed(object sender, ElapsedEventArgs e)
{
//Do Something
if (myCondition==true)
{
//Do Something
tmr.Stop(); // Or Change Value of a Property! anything that shows it
//meets the condition.
}
}
}
Class WorkflowController
{
list<ClassA> allA=new list<ClassA>(){new A1,new A2, new A3}
void Start()
{
foreach(item in allA)
{
item.start()
}
}
}
问题:
现在我希望foreach loop
执行A1.Start()
并等到计时器满足条件(此处为x>50
且50秒后)并停止。然后执行A2.Start()
并等到计时器满足条件并再次停止。然后执行A3.Start()
,依此类推。 WorkFlowController
控制我的应用程序的工作流程。我不知道做这件事的简单方法是什么。我可以使用INotifyPropertyChanged
吗?我应该使用Eventhandler
吗?还是有更好的方法?
答案 0 :(得分:2)
您可以使用事件处理程序来同步它
ClassA
{
ManualResetEvent mre = new ManualResetEvent(false);
Timer tmr = new Timer(1000);
void Start()
{
tmr.start();
}
void tmr_Elapsed(object sender, ElapsedEventArgs e)
{
x++;
if (x > 50)
{
//Do Something
tmr.Stop(); // Or Change Value of a Property! anything that shows it
//meets the condition.
mre.Set();
}
}
public void Wait()
{
mre.WaitOne();
}
}
Class WorkflowController
{
list<ClassA> allA=new list<ClassA>(){new A1,new A2, new A3}
void Start()
{
foreach(item in allA)
{
item.start();
item.Wait();
}
}
}
答案 1 :(得分:1)
您可以在以下实施中使用任务:
List<ClassA> all = new List<ClassA> { ... };
private async void Start()
{
foreach (var item in all)
{
await item.DoWork();
}
}
public class ClassA
{
public async Task DoWork()
{
Thread.Sleep(50000); // wait 50sec
// Do work
}
}
您有"How to: Wait on One or More Tasks to Complete" here
希望它有所帮助!
答案 2 :(得分:1)
private async void Start()
{
foreach (var item in all)
{
await item.DoWorkAsync();
}
}
public class ClassA
{
public async Task DoWorkAsync()
{
bool done = false;
while(!done)
{
DoStuff();
DoMoreStuff();
if(someCondition)
{
done = true;
}
else
{
await Task.Delay(1000);
}
}
}
}
答案 3 :(得分:0)
在实践中,你的代码似乎没有什么不同。
for(var i = 0; i < 3; i++)
{
Thread.Sleep(1000)
Task.Wait(Task.StartNew(() =>
{
//Do Something
if (myCondition==true)
{
// Do Something
// Or Change Value of a Property! anything that shows it
// meets the condition.
}
});
}