2011-05-04 66 views
0

我有用於Silverlight客戶端的WCF WebService。WCF - 如何將任務延遲指定的時間?

假設客戶點擊「Make building」。

服務將接收新的任務和明星計數時間,直到它準備好進行操作(即添加到數據庫)。

時間 - 任務需要完成多少時間(即構建建築物)。

關鍵是如何將任務延遲一段時間。

此外,有沒有辦法從服務器流到客戶端的時間? 我已經安裝此:

 [OperationContract] 
    public void GetTime() 
    { 
     foreach (IDuplexClient client in _clientDic.Values) 
     { 
      client.ShowStatus(DateTime.Now); 
     } 
    } 

     [OperationContract] 
    public void Login() 
    { 
     string clientID = OperationContext.Current.Channel.SessionId; 
     IDuplexClient client = OperationContext.Current.GetCallbackChannel<IDuplexClient>(); 

     _clientDic.Add(clientID, client); 
    } 

IDuplexClient:

 [OperationContract(IsOneWay = true)] 
    void ShowStatus(DateTime status); 

和客戶端:

  _client.LoginAsync(); 
     _client.GetTimeAsync(); 
     _client.ShowStatusReceived += new EventHandler<ShowStatusReceivedEventArgs>(_client_ShowStatusReceived); 

     void _client_ShowStatusReceived(object sender, ShowStatusReceivedEventArgs e) 
    { 
     label1.Content = e.status.ToString(); 
    } 

它的工作。對於第一次運行。但時間不會刷新,這不是我想要的。 以及在瀏覽器中強制刷新之後,時間停止顯示。

public partial class MainPage : UserControl 
{ 
    Service1Client _client; 
    int time = 10000; 
    public MainPage() 
    { 
     InitializeComponent(); 
     _client = new Service1Client(new PollingDuplexHttpBinding { DuplexMode = PollingDuplexMode.SingleMessagePerPoll, OpenTimeout = TimeSpan.FromMinutes(10), ReceiveTimeout = TimeSpan.FromMinutes(10) }, 
new EndpointAddress("http://localhost:44544/Service1.svc")); 

     _client.LoginAsync(); 
     _client.DoWorkCompleted += new EventHandler<DoWorkCompletedEventArgs>(_client_DoWorkCompleted); 
     _client.DoWorkAsync(); 
     _client.AddNewTaskAsync("testTaskzor", time); 
     _client.GetTimeAsync(); 
     //_client.AddNewTaskCompleted += new EventHandler<AddNewTaskCompletedEventArgs>(_client_AddNewTaskCompleted); 
     _client.ShowStatusReceived += new EventHandler<ShowStatusReceivedEventArgs>(_client_ShowStatusReceived); 

    } 

    void _client_ShowStatusReceived(object sender, ShowStatusReceivedEventArgs e) 
    { 
     label1.Content = e.status.ToString(); 
    } 

    void _client_DoWorkCompleted(object sender, DoWorkCompletedEventArgs e) 
    { 
     //label1.Content = e.Result; 
    } 
} 

這就是整個客戶端代碼。 雖然我終於修好了,並且時間正確地流到了客戶端(它至少在現在這個時候已經夠用了,但它足以讓foreach以正確的方式出現)。

但在另一邊。當我關閉瀏覽器並再次打開時,什麼也沒有顯示出來。在我刷新它之後,時間根本不顯示。

+0

@Lukasz - 你能展示客戶端的實現嗎? – 2011-05-04 12:22:22

回答

0

最簡單的方法是在客戶端實現延遲。在不破壞模型的情況下,您無法真正推遲像WCF這樣的RESTful服務。

+0

這個雲是一個選項......但它不安全。如果客戶更換頁面怎麼辦?或者如果能找到方法來修改計時器? 我希望客戶只提供數據和服務來處理所有其他事情。 – 2011-05-04 15:15:10