对于上下文:我想在EMG和相机的“同一时间”开始。
看起来像这样:
Public class EMG
{
public void startemg()
{
EMG emg = new EMG();
emg.Initialize(); //takes a lot of time
emg.Start();
[...]
}
}
然后当我点击按钮时启动相机和EMG:
private void button2_Click(object sender, EventArgs e)
{
Task t = new Task(EMG.startemg);
Task t1 = new Task(Camera.start)
t.Start();
t1.Start();
}
我最大的问题是初始化EMG需要相当长的时间(几秒钟......)所以我的相机和EMG的采集开始之间存在很大的差距。然后我想开始emg.Start()
& Camera.start
在“同一时间”。
我不想将camera.start
放在我的EMG课上。
我尝试将emg.initialize
和emg.RecordStart
分成两个单独的空格,但这是不可能的只有当它们与EMG emg = new EMG();
在同一个空白中时才有效。
我无法将await task.run
与emg.start
最好的方法是先启动EMG课程,让它在emg.start
之前等待,直到我点击按钮。使该线程等待并使用该按钮动态启动它。
或者在t1
完成后让emg.initialize
开始会更容易。
谢谢。
答案 0 :(得分:0)
您可以尝试使用像ManulResetEvent这样的WaitHandler进行同步。我猜测同一个线程在EMG上调用Initialize和Start是很重要的。
public class EMG
{
private ManualResetEvent waitHandler = new ManualResetEvent(false);
public void Initialize()
{
EMG emg = new EMG();
emg.Initialize(); //takes a lot of time
waitHandler.WaitOne();
emg.Start();
}
public void Start()
{
waitHandler.Set();
}
}
private void button2_Click(object sender, EventArgs e)
{
Task cameraTask = new Task(Camera.start)
cameraTask .Start();
EMG.Start();
}
答案 1 :(得分:0)
嗯...尝试以下
public class EMG
{
// Local variable
EMG emg = new EMG();
// Task to hod init process
Task cameraInitTasks;
public EMG():base()
{
InitMyOtherStuff(); // Other init code
// Create your task on class initialization
cameraInitTasks = new Task(EMG.startemg);
// Start it
cameraInitTasks.Start();
}
public button2_Click()
{
// jic, wait until task finished
cameraInitTasks.Wait();
// This one should take little time, right?
emg.Start();
// Go and take the picture
DoPictureTake()
}
...
}
未经测试但应该正常工作