2013-08-22 93 views
-2

只有在設置了該值之後,get set屬性才返回該值。我已經使用了反應式庫並訂閱了它在不同線程上運行的消息。當事件發生並設置了值時,捕獲該值並返回。只有當它被設置時才獲取字符串值c#

internal PinMessage() 
     { 
      obj.PinsAvailable.ObserveOn(SynchronizationContext.Current).Subscribe(HandlePinsAvailable); 
     }  

     private void HandlePinsAvailable(byte[] pinBytes) 
     { 
      pinmesssage = Encoding.ASCII.GetString(pinBytes);   
     } 

     public void Readvalue(object stringobj) 
     { 
      pinmesssage = (string)stringobj; 
     } 

     internal string GetPinMessage(string AccoutNumber) 
     { 
      string pinstring = string.Empty; 
      obj.SendPinRequest(AccoutNumber); 
      t1.Join(); 
      pinstring = pinmesssage; 
      return pinstring; 
     } 

     private string _pinMessafe; 

     public string pinmesssage 
     { 
      get 
      { 
//Get value only when the property is set 
       return _pinMessafe; 
      } 
      set { _pinMessafe = value; } 
     } 
+3

什麼問題? – paqogomez

+0

如果它是一個字符串,只需檢查'_pinMessafe'是否爲空/空,並且只有返回false。 – tnw

+0

@tnw假設你檢查了它並且它不是null,並且在你返回它之前,不同的線程將它設置爲null。 – I4V

回答

0

如果你想等待另一個線程設置一個值,你可以使用TaskCompletionSource

您創建一個TaskCompletionSource地方

TaskCompletionSource<string> tcs = new TaskCompletionSource<string>(); 

在生成你做

價值線
tcs.SetResult("some string message"); 

在等待結果的線程上做異步方法

string message = await tcs.Task 

然而

string message = tcs.Task.Result; // Will block the current thread 

或更好地利用async await pattern如果你真的使用Reactive Extensions那麼你應該 可能會使用它的整個管道,而不是上面的圖案。 你或許應該寫

string message = await MessageSource().Take(1); 

其中的MessageSource會對你在這裏混了很多東西signiture

IObservable<string> MessageSource(); 
+0

這真的很有用我不能爲它投票,我是一個新手。我需要它的原因我有異步線程,我必須將它們同步到一個單一的方法。這樣一旦我在方法中發送消息,我就可以返回一個值。目前我正在使用onObserve,當數據可用時,請檢索它。我正在建立一個庫,在那裏我發送消息並接收數據CLASSIC STYLE – RookieRoll

0

。當你使用Rx時,你不會嘗試通過執行線程連接來編組線程。您不會移入和移出Rx代碼。

你的代碼也許應該是這個樣子:

internal IObservable<string> GetPinMessage(string AccoutNumber) 
{ 
    return Observable 
     .Start(() => obj.SendPinRequest(AccoutNumber)) 
     .Select(pinBytes => Encoding.ASCII.GetString(pinBytes)) 
     .ObserveOn(SynchronizationContext.Current); 
} 

我認爲SendPinRequest是一個同步請求。 Rx會將它變成一個單值的異步可觀察對象。

相關問題