0

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) ステートメントで囲むだけで十分だったので、驚くほど簡単でした)。

しかし、反対側に。ブラウザを閉じて再度開くと、何も表示されません。リフレッシュした後も、時間がまったく表示されません。

4

1 に答える 1

0

最も簡単な方法は、クライアント側で遅延を実装することです。モデルを壊さずに WCF のような RESTful サービスを実際に遅らせることはできません。

于 2011-05-04T12:24:43.157 に答える