1

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

2 回答 2

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

于 2013-08-23T01:20:43.923 回答
2

只需制作 ka 属性并将CollectMethod调用包含在 setter 中。

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);
  }
}

这确保只有一个线程可以访问该属性。

于 2013-08-22T22:32:39.680 回答