我如何等待字符串从null变为某个值,然后他们收集它
本文关键字:然后 他们 何等待 等待 null 字符串 | 更新日期: 2023-09-27 18:28:46
当它的属性发生变化时收集值,该方法需要一些时间来获取字符串。我必须等到字符串从NULL变为某个值,在它变了之后,我必须收集它并返回。这是两条不同的线。。
public static string k=string.Empty;
public void SomeMethod()
{
k=someObject.Method(byte[]);// this returns some string this methods takes some time to execute
CollectMethod(k);
}
Public string CollectMethod(string K);
{
return k;// Return only when the k is not null
}
只需将k作为一个属性,并在setter中包含CollectMethod
调用。
private static string _k;
public static string k
{
get {
return _k;
}
set {
_k = value;
CollectMethod(value);
}
}
这样,即使您从不同的线程分配值,CollectMethod
也不会被调用,直到分配发生。
当您打算从多个线程访问该属性时,确保该属性的线程安全是很重要的。要做到这一点,您只需要一个可以在.上lock
的对象
private static object kLock = new object();
private static string _k;
public static string k
{
get {
lock (kLock)
{
return _k;
}
}
set {
lock (kLock)
{
_k = value;
}
CollectMethod(value);
}
}
这样可以确保只有一个线程可以访问该属性。
使用ManualResetEvent暂停一个线程,并在另一个方法返回时从另一个线程发出信号:
public static string k=string.Empty;
public ManualResetEvent waitForStringEvent = new ManualResetEvent(false);
public void SomeMethod()
{
k=someObject.Method(byte[]);// this returns some string this methods takes some time to execute
// After a while, someObject.Method() will return, and we'll signal the event
waitForStringEvent.Set();
// ...
}
Public string CollectMethod(string K);
{
waitForStringEvent.WaitOne(); // This will block until signaled
return k;// Return whatever is in k once signalled
}
两个线程都可以安全地访问waitForStringEvent
对象。