WCF - Как отложить задачу на указанное количество времени? - PullRequest
0 голосов
/ 04 мая 2011

У меня есть клиент WCF WebService для Silverlight.

Допустим, клиент нажимает «Создать здание».

Служба получит новое задание и время подсчета звезд, пока не будет готово выполнить действие (т.е. добавить в базу данных).

Время - сколько времени потребуется для выполнения задания (т.е. для созданияздание).

Суть в том, как отложить задачу на определенное время.

Кроме того, есть ли способ передачи времени с сервера на клиент?Я настроил это:

        [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), по крайней мере, на данный момент).

Но с другой стороны.Когда я закрываю браузер и снова открываю его, ничего не появляется.Как и после того, как я обновляю его, время вообще не отображается.

1 Ответ

0 голосов
/ 04 мая 2011

Самый простой способ - реализовать задержку на стороне клиента. Вы действительно не можете отложить RESTful-сервис, такой как WCF, не нарушая модель.

...