我有一个与外部 .exe 对话的课程。该类有一堆类似的方法;他们调用 .exe 的函数,等待响应,然后返回 true 或 false。
响应以更改此类字段值的事件的形式出现。
简化代码:
class Manager
{
private static bool connected = false;
public static bool Connect()
{
runtime.Connect();
int secondsWaited = 0;
while (!connected)
{
Thread.Sleep(1000);
if (secondsWaited++ == 10)
{
return false;
}
}
return true;
}
}
其他方法使用相同的 call-wait-loop-return 结构。
我的目标是制作一个等待我的方法来执行此操作,如下所示:
private static bool WaitReferenceEqualsValue<T>(ref T reference, T value)
{
int secondsWaited = 0;
while (!reference.Equals(value))
{
Thread.Sleep(1000);
if (secondsWaited++ == 10)
{
return false;
}
}
return true;
}
然后每种方法都会做:
runtime.DoSomething();
return WaitReferenceEqualsValue<someType>(ref someField, someSuccessfulValue);
但是,当我用此方法调用替换等待循环时,“已连接”字段,即使作为引用传入,也始终保持不变。
知道这里发生了什么,以及如何获得所需的功能吗?
提前致谢。
编辑:
public static bool Connect()
{
...
runtime.Connect();
// this code works
/*int secondsWaited = 0;
while (connected != true)
{
Thread.Sleep(1000);
if (secondsWaited++ == 10)
{
return false;
}
}*/
// this somehow blocks OnConnect from firing, so connected never gets set to true
lock (typeof(SkypeKitManager))
{
WaitReferenceEqualsValue<bool>(ref connected, true);
}
...
}
连接:
private static void OnConnect(object sender, Events.OnConnectArgs e)
{
if (e != null && e.success)
{
lock (typeof(Manager))
{
connected = true;
}
}
}