Это сценарий:
Я делаю веб-сервис в WCF и клиентское приложение в ASP. NET. Язык VB. NET.
- Я хочу метод, чем отправлять «задания» на сервер. Я пытаюсь смоделировать этот вид заданий в виде долго выполняющихся процессов, которые ожидают до 20-30 секунд с бездействием потока и вставкой строки в таблицу JOBS в БД.
- Мне нужен другой метод, который опрашивает база данных каждые 5 секунд с постбеками клиента для получения списков заданий из таблицы JOBS (завершено и в данный момент выполняется)
Это то, что я получил, оба метода работают, кроме если долго выполняющееся задание находится в спящем режиме, клиент не может получить список заданий с помощью другого вызова . Я попробовал "PerCall" в, но это не сработало. Я подозреваю, что поток в некоторой степени блокирует службу или, возможно, мне придется использовать вызовы asyn c. Я использую HttpBasicBinding в web.config ... Я немного растерялся и не нашел ни одного кода, делающего что-то похожее.
Вот код на стороне службы:
iServiceJobs.vb
<ServiceContract()>
Public Interface IServiceJobs
<OperationContract(IsOneWay:=True)>
Sub SendJob(ByVal runTime As Integer, ByVal id As String)
<OperationContract>
Function GetJobsList() As List(Of ClassJob)
ServiceJobs.vb
Public Class ServiceJobs Implements IServiceJobs
Public SendJob(ByVal runTime As Integer, ByVal id As String) Implements IServiceJobs.SendJob
Dim connStr As String = "..."
Dim conn As New OracleConnection(connStr)
conn.Open()
Dim query As String = "INSERT INTO JOBS(...)"
Dim cmd As New OracleCommand(query, conn)
cmd.ExecuteNonQuery()
Threading.Thread.Sleep(runTime* 1000)
cmd = New OracleCommand(query, conn)
cmd.ExecuteNonQuery()
End Sub
Public Function GetJobList() As List(Of ClassJob) Implements IServiceJobs.GetJobsList
Try
Dim jobList As New List(Of ClassJobs)
Dim connStr As String = "..."
Dim conn As New OracleConnection(connStr)
conn.Open()
Dim query As String = "SELECT * FROM JOBS"
Dim cmd As New OracleCommand(query, conn)
Dim dr As OracleDataReader
Dim job As ClassJob
dr = cmd.ExecuteReader
While dr.Read
job = New ClassJob
job.id = dr(0)
job.lock = dr(3)
...
jobList.Add(job)
job = Nothing
End While
Return jobList
Catch ex As Exception
Return Nothing
End Try
End Function
End Class
Код в клиенте очень прост: всего две кнопки, одна с вызовом ws для вставки и другая для получения список заданий.
Я открыт для любых предложений о том, как лучше реализовать этот сценарий.
РЕДАКТИРОВАТЬ: я пытался
<ServiceBehavior(ConcurrencyMode:=ConcurrencyMode.Multiple, InstanceContextMode:=InstanceContextMode.PerCall)>
Но это не работает, GetJobList () ничего не возвращает, пока SendJob () работает с этим потоком.
решено : По-видимому, я использовал устаревшую версию Oracle библиотек. Когда я использовал Oracle .ManagedDataAccess от NuGet, все прошло нормально.