我如何等待字符串从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
}

我如何等待字符串从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对象。