我如何等待字符串从null更改为某个值,然后收集它

时间:2013-08-22 22:28:51

标签: c# string

当属性发生变化时收集值,该方法需要一些时间来获取字符串。我必须等到字符串从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
}

2 个答案:

答案 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对象。