WCF - Как отложить задачу на указанное количество времени?
У меня есть 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 ответ
Самый простой способ - реализовать задержку на стороне клиента. Вы не можете действительно отложить RESTful-сервис, такой как WCF, не нарушая модель.