Azure Function Singleton 服务线程安全吗?
Azure Function Singleton Service thread Safe?
我正在使用 Azure-functions,我有一个 class 在 DI 配置中配置为单例,class 公开了 2 个方法:
public void methodA(out objectA)
{
...
methodB(out objectA.objectB)
objectA.xxx = ....
...
}
public void methodB(out objectB)
{
...
objectB = ...
}
看了单例之后,我的理解是它会像一个全局变量。因此,我怀疑 AF 的一个实例可能会调用 methodA,而 AF 的另一个实例可能会调用 methodB 并覆盖在第一个函数上设置的值 objectA.objectB...
我试图通过单元测试来证明这一点。
public void Multithread_Test()
{
...
singletonClass.methodA(out objectA);
...
singletonClass.methodB(out objectB);
...
Assert.AreEqual(objectB, objectA.objectB);
}
这没有用,我在测试中看到至少 2 个问题:
首先,methodA的调用在methodB的调用开始之前完成,这里是同步调用的(我没有多个AF实例)。
其次,DI 容器在这里并没有真正起作用,所以通过使用相同的 singletonClass 实例,我可能没有做同样的事情,认为 DI 容器确实...
更新:
现在我正在尝试:
public void Multithread_Test()
{
...
Parallel.Invoke(
() =>
{
singletonClass.methodA(out objectA);
Assert.AreEqual(objectA.objectB, expectedObjectB);
//expectedObjectB != expectedObjectC
},
() => {
singletonClass.methodB(out objectC)
Assert.AreEqual(objectC, expectedObjectC);
//expectedObjectB != expectedObjectC
}
);
}
我还在方法 B 的函数调用之后添加了一个 ThreadSleep,但结果似乎指向一切正常,没有覆盖...
我的 question/s 是:
- 代码是线程安全的吗?或者我的担心是正确的?
- 当使用 AF、DI 时,最好的测试方法是什么?
没有状态的单例不会有任何线程安全问题
我正在使用 Azure-functions,我有一个 class 在 DI 配置中配置为单例,class 公开了 2 个方法:
public void methodA(out objectA)
{
...
methodB(out objectA.objectB)
objectA.xxx = ....
...
}
public void methodB(out objectB)
{
...
objectB = ...
}
看了单例之后,我的理解是它会像一个全局变量。因此,我怀疑 AF 的一个实例可能会调用 methodA,而 AF 的另一个实例可能会调用 methodB 并覆盖在第一个函数上设置的值 objectA.objectB...
我试图通过单元测试来证明这一点。
public void Multithread_Test()
{
...
singletonClass.methodA(out objectA);
...
singletonClass.methodB(out objectB);
...
Assert.AreEqual(objectB, objectA.objectB);
}
这没有用,我在测试中看到至少 2 个问题:
首先,methodA的调用在methodB的调用开始之前完成,这里是同步调用的(我没有多个AF实例)。
其次,DI 容器在这里并没有真正起作用,所以通过使用相同的 singletonClass 实例,我可能没有做同样的事情,认为 DI 容器确实...
更新:
现在我正在尝试:
public void Multithread_Test()
{
...
Parallel.Invoke(
() =>
{
singletonClass.methodA(out objectA);
Assert.AreEqual(objectA.objectB, expectedObjectB);
//expectedObjectB != expectedObjectC
},
() => {
singletonClass.methodB(out objectC)
Assert.AreEqual(objectC, expectedObjectC);
//expectedObjectB != expectedObjectC
}
);
}
我还在方法 B 的函数调用之后添加了一个 ThreadSleep,但结果似乎指向一切正常,没有覆盖...
我的 question/s 是:
- 代码是线程安全的吗?或者我的担心是正确的?
- 当使用 AF、DI 时,最好的测试方法是什么?
没有状态的单例不会有任何线程安全问题