当属性发生变化时收集值,该方法需要一些时间来获取字符串。我必须等到字符串从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
}
答案 0 :(得分:2)
只需将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);
}
}
这确保只有一个线程可以访问该属性。
答案 1 :(得分:2)
使用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
对象。