gpt4 book ai didi

C# "ref"没有按照我的想法去做

转载 作者:行者123 更新时间:2023-12-02 22:11:18 25 4
gpt4 key购买 nike

我有一个与外部 .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;
}
}

其他方法使用相同的调用-等待-循环-返回结构。

我的目标是让一个单一的方法来等待我这样做,就像这样:

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;
}
}
}

最佳答案

虽然您从多个线程访问它并且其中一个正在写入,但您没有对该字段进行任何同步。这是一场比赛(也不异常(exception)!这是一场比赛,即使它看起来很安全。它并不安全。)。

可能是 JIT 注册了它,这是一种常见的优化。它永远不会从内存中读取,总是从寄存器中读取。添加同步(例如锁、Interlocked 或 Volatile 方法)。

您对 ref 的使用是正确的。

关于C# "ref"没有按照我的想法去做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15280477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com