Мой веб-сервис выглядит так:
[WebMethod]
public clsReponse MyWS(string a, string b, string c) {
clsReponse reply = doSth( a, b, c );
return reply;
}
public clsReponse doSth(string a, string b, string c) {
// Call other web service and hard disk I/O (i.e. write log files)
}
public class clsReponse() {
public bool success { get; set; }
public string msg { get; set; }
}
Я знаю, что клиентский вызов MyWS
установил 60-секундный тайм-аут, но я хочу ответить в течение 30 секунд. Если doSth()
не выполнил свою работу в течение 30 секунд, я сначала хочу ответить клиенту, позволяя ему завершить sh свою работу.
Я подумываю установить таймер в MyWS()
, изменив doSth()
на async
метод. Но во-первых, я не уверен, означает ли это, что у каждого запроса будет свой таймер?
Во-вторых, я искал inte rnet, и кажется, что async
/ await
не следует использовать в веб-методах?
Я так растерялся. Есть ли лучший способ сделать это?
Спасибо за редактирование и комментарии!
Я ожидаю ответить на сообщение типа "Слишком долго" клиенту, но я не готов для второй конечной точки. Сейчас я просто хочу записать процесс doSth()
в файл журнала. Поэтому, когда метод завершен, ничего не выводится.
Это может быть ответом:
[WebMethod]
public clsReponse MyWS(string a, string b, string c) {
float m_state = 0;
clsReponse reply = null;
Task task = Task.Run( () => { reply = doSth( a, b, c ); } );
do {
if( task.IsCompleted )
return reply;
m_state += (float)1000 / 1000;
Thread.Sleep( 1000 );
} while( m_state < 30 );
return reply = new clsReponse(){ success = false; msg = "Timeout." };
}
Пожалуйста, ответьте, если есть лучший способ сделать это. Спасибо.