Silverlight クライアント用の WCF WebService があります。
クライアントが「建物を作る」をクリックしたとしましょう。
サービスは、アクションを実行する (データベースに追加する) 準備が整うまで、新しいタスクと星のカウント時間を受け取ります。
時間 - タスクを完了するのに必要な時間 (建物の建設など)。
ポイントは、タスクを一定時間遅らせる方法です。
また、サーバーからクライアントに時間をストリーミングする方法はありますか? 私はこれをセットアップしました:
[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 を while(true) ステートメントで囲むだけで十分だったので、驚くほど簡単でした)。
しかし、反対側に。ブラウザを閉じて再度開くと、何も表示されません。リフレッシュした後も、時間がまったく表示されません。