2016-09-25 20 views
0

我正在寫一個封裝了一個狀態機的類,它代表了我的應用程序嘗試與我自己的Web服務進行通信。基本狀態已斷開連接,連接並需要憑證。我認爲有關使用Rx發佈狀態更改與BehaviorSubject的良好學習經驗(希望這本身就是很好的用法?)。我的這個主題的狀態之一是'需要證書',我需要在繼續之前提示用戶提供用戶名和密碼。對於這個練習的目的,讓我們假設這個類在Windows控制檯應用程序託管,並且我想與您如何請求使用Rx的用戶輸入?

Console.WriteLine("Enter username"); 
var userName = Console.ReadLine(); 
Console.WriteLine("Enter password"); 
var password = Console.ReadLine(); 

由於我的Rx BehaviorSubject的結果擊中狀態「RequiresCredentials」,它提示用戶每當這個狀態被擊中時都應該擊中這個。

我已經暴露了BehaviorSubject作爲自身(即沒有隱藏它可觀察到的接口或任何後面)

public BehaviorSubject<ConnectionState> State { get; } 

,並希望爲憑證被阻止該請求。

我應該使用什麼過程來正確訂閱此主題,等待此輸入​​並最終將控制返回給調用線程?

回答

2

如果您不使用任務或等待或任何異步,Rx預訂代碼將在同一線程中觀察,並阻止您是否使用阻止代碼。如果你不關心輸入,那麼你可以直接輸入Subscribe。如果你想使用輸入的用戶名/密碼,那麼你可以使用Select。因此,這會工作:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var subject = new BehaviorSubject<ConnectionState>(ConnectionState.Disconnected); 

     var getCredentials = subject.Where(cs => cs == ConnectionState.RequiresCredentials) 
      .Select(cs => 
      { 
       Console.WriteLine("Enter username"); 
       var userName = Console.ReadLine(); 
       Console.WriteLine("Enter password"); 
       var password = Console.ReadLine(); 
       return Tuple.Create(userName, password); 
      }); 
     using (var subscription = getCredentials.Subscribe()) 
     { 
      Console.WriteLine("Changing to Connecting..."); 
      subject.OnNext(ConnectionState.Connecting); 
      Console.WriteLine("Changing to RequiresCredentials..."); 
      subject.OnNext(ConnectionState.RequiresCredentials); 
      Console.WriteLine("Connected."); 
      subject.OnNext(ConnectionState.Connected); 
     } 

    } 
} 

enum ConnectionState 
{ 
    Disconnected, 
    Connected, 
    Connecting, 
    RequiresCredentials 
} 

它產生以下輸出:

Changing to Connecting... 
Changing to RequiresCredentials... 
Enter username 
ThisIsMyUserName 
Enter password 
ThisIsMyPassword 
Connected. 

這是一個相當落後的使用Rx的是:如果你正在尋找在迭代的,程序性的方式來使用的Rx,你爲什麼不使用C#並且保存自己的複雜性?

+0

謝謝@Shiomo最終將以完全異步的方式將這個類作爲「真實」應用程序控制臺進行實驗時使用。它位於PCL庫中,將被各種基於Xamarin的主機使用。對憑證的需求將是一個提示,如果他們更改或過期,所以我認爲Rx將非常適合後臺提示,還可以啓動和停止更復雜的後臺數據庫同步進程的其他部分。該應用程序設計用於在線和離線工作,所以雖然我的例子有點基本,但我相信Rx很適合以後。 –

相關問題