Асинхронный http-обработчик, обрабатывающий csv-файлы в asp.net

#asp.net #csv #iis-6 #long-polling #ihttpasynchandler

#asp.net #csv #iis-6 #длительный опрос #ihttpasynchandler

Вопрос:

Я разработал приложение для подсчета очков в реальном времени, основанное на подходе с длительным опросом, или Comet, как они его еще называют. Я использовал ASP.NET 4.0, работающий на IIS 6 (Windows 2003 — только два процессора, что не очень помогает мне с доступностью потоков в пуле).

Данные поступают в виде .csv файлов, которые вставляются в исходную папку на веб-сервере, которые я затем импортирую с использованием поставщика OleDb Microsoft JET 4.0 и отображаю с использованием различных методов, в зависимости от части приложения.

Механизм части длинного опроса основан на IHttpAsyncHandler. Поскольку это приложение для подсчета очков в реальном времени, пользователь посещает веб-сайт, получает регулярный ответ с текущими данными и при загрузке тела отправляет новый запрос через jquery ajax асинхронному http-обработчику.

Затем этот обработчик сохраняет запрос в очереди и возвращает (обычно) поток обратно в пул потоков. Как только это произойдет, я создаю событие ручного сброса и удерживаю операцию, пока создается объект наблюдателя файловой системы и отправляется для поиска изменений в папке источника данных csv.

Как только он запускает onChange событие, я устанавливаю событие ручного сброса, и асинхронной операции разрешается возобновить с получением новых, обновленных csv-файлов и ответить клиенту свежими данными.

Все это было бы неплохо, если бы я не получал ошибки все время. В общем, в очень-очень общих чертах, приложение работает, но у меня проблема, на которую я не могу точно указать.

А именно, я не уверен, связана ли проблема с доступом к csv-файлам, поскольку они могут быть заблокированы процессом, который отправляет их на сервер (передача по ftp со спортивного объекта). Или, может быть, это мое (ab) использование IHttpAsyncHandler , или, может быть, просто у меня недостаточно процессоров и потоков (во что мне трудно поверить, поскольку у меня всего около 3000 уникальных посетителей каждый день. Я не знаю номера по часам).

Возможно ли, что IIS 6 Windows 2003 с двумя процессорами не может поддерживать такого рода приложения?

вот ошибки, которые я продолжаю получать:

Тип события: Ошибка Источник события: ASP.NET Категория события 4.0.30319.0: Нет Идентификатор события: 1325 Дата: 20/04/2011 Время: 15:33:14 Пользователь: N / A Компьютер: xxx Описание: Произошло необработанное исключение, и процесс был завершен.

Идентификатор приложения: /LM/W3SVC/1 / Идентификатор КОРНЕВОГО процесса: 5264 Исключение: System.Data.Сообщение об исключении OleDb.OleDbException: неопределенная ошибка

Отслеживание стека: в System.Data.OleDb.OleDbConnectionInternal..ctor (OleDbConnectionString constr, OleDbConnection connection)
в системе.Данные.OleDb.OleDbConnectionFactory.Создайте соединение (параметры DbConnectionOptions, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject) в System.Data.База поставщиков.DbConnectionFactory.Создайте Nonpooledconnection (DbConnection owningConnection, DbConnectionPoolGroup poolGroup) в System.Data.База поставщиков.DbConnectionFactory.getConnection (DbConnection owningConnection) в System.Data.База поставщиков.DbConnectionClosed.Откройте соединение (DbConnection Outconnection, DbConnectionFactory ConnectionFactory) в System.Data.OleDb.OleDbConnection.Откройте () в Broker.brCSV.readCSV(строковое имя файла) при настройке времени выборки.Асинхронная работа.Запустите synctask (объект workItemState) в системе.Потоковая обработка.Обратный вызов QueueUserWorkItemCallback.WaitCallback_Context (состояние объекта) в системе.Потоковая обработка.ExecutionContext.runTryCode(пользовательские данные объекта) в System.Runtime.Службы компилятора.RuntimeHelpers.Запустите CODE с гарантией очистки (TryCode code, CleanupCode backoutCode, Object userData) в системе.Потоковая обработка.ExecutionContext.Выполнить внутренний (ExecutionContext ExecutionContext, обратный вызов ContextCallback, состояние объекта) в системе.Потоковая обработка.ExecutionContext.Run (ExecutionContext ExecutionContext, обратный вызов ContextCallback, состояние объекта, логическое игнорирование SyncCtx) в системе.Потоковая обработка.Обратный вызов QueueUserWorkItemCallback.Система.Потоковая обработка.IThreadPoolWorkItem.ExecuteWorkItem() в системе.Потоковая обработка.ThreadPoolWorkQueue.Отправка () в систему.Потоковая обработка._ThreadPoolWaitCallback.Выполните Waitcallback()

And also:

Event Type: Error Event Source: .NET
Runtime 4.0 Error Reporting Event
Category: None Event ID: 5000 Date:
20/04/2011 Time: 15:33:14 User:
N/AComputer: xxx Description:EventType
clr20r3, P1 w3wp.exe, P2
6.0.3790.3959, P3 45d6968e, P4 system.data, P5 4.0.0.0, P6 4ba1e064,
P7 1ea3, P8 87, P9
system.data.oledb.oledbexception, P10
NIL. For more information, see Help
and Support Center at
http://go.microsoft.com/fwlink/events.asp.Data:0000:
63 00 6c 00 72 00 32 00
c.l.r.2.0008: 30 00 72 00 33 00 2c 00
0.r.3.,.0010: 20 00 77 00 33 00 77 00 .w.3.w.0018: 70 00 2e 00 65 00 78 00
p…e.x.0020: 65 00 2c 00 20 00 36 00
e.,. .6.0028: 2e 00 30 00 2e 00 33 00
..0…3.0030: 37 00 39 00 30 00 2e 00
7.9.0…0038: 33 00 39 00 35 00 39 00 3.9.5.9.0040: 2c 00 20 00 34 00 35 00 ,. .4.5.0048: 64 00 36 00 39 00 36 00
d.6.9.6.0050: 38 00 65 00 2c 00 20 00
8.e.,. .0058: 73 00 79 00 73 00 74 00 s.y.s.t.0060: 65 00 6d 00 2e 00 64 00
e.m…d.0068: 61 00 74 00 61 00 2c 00
a.t.a.,.0070: 20 00 34 00 2e 00 30 00
.4…0.0078: 2e 00 30 00 2e 00 30 00
..0…0.0080: 2c 00 20 00 34 00 62 00
,. .4.b.0088: 61 00 31 00 65 00 30 00
a.1.e.0.0090: 36 00 34 00 2c 00 20 00
6.4.,. .0098: 31 00 65 00 61 00 33 00 1.e.a.3.00a0: 2c 00 20 00 38 00 37 00 ,. .8.7.00a8: 2c 00 20 00 73 00 79 00
,. .s.y.00b0: 73 00 74 00 65 00 6d 00
s.t.e.m.00b8: 2e 00 64 00 61 00 74 00
..d.a.t.00c0: 61 00 2e 00 6f 00 6c 00
a…o.l.00c8: 65 00 64 00 62 00 2e 00
e.d.b…00d0: 6f 00 6c 00 65 00 64 00
o.l.e.d.00d8: 62 00 65 00 78 00 63 00
b.e.x.c.00e0: 65 00 70 00 74 00 69 00
e.p.t.i.00e8: 6f 00 6e 00 20 00 4e 00
o.n. .N.00f0: 49 00 4c 00 0d 00 0a 00
I.L…..

and…

Event Type: Error Event Source: .NET
Runtime Event Category: None Event ID:
1026 Date: 20/04/2011 Time: 15:34:26
User: N/A Computer: xxx
Description:Application: w3wp.exe
Framework Version: v4.0.30319
Description: The process was
terminated due to an unhandled
exception.Exception Info:
System.Data.OleDb.OleDbException

Stack: at
System.Data.ProviderBase.DbConnectionClosed.OpenConnection(System.Data.Common.DbConnection,
System.Data.ProviderBase.DbConnectionFactory)
at
System.Data.OleDb.OleDbConnection.Open()
at Broker.brCSV.readCSV(System.String)
at
[ProjectNamespace].AsynchOperation.StartAsyncTask(System.Object)
at
System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(System.Object)
at
System.Threading.ExecutionContext.runTryCode(System.Object)
at
System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode,
CleanupCode, System.Object) at
System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext,
System.Threading.ContextCallback,
System.Object) at
System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,
System.Threading.ContextCallback,
System.Object, Boolean) at
System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at
System.Threading.ThreadPoolWorkQueue.Dispatch()
at
System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

A few more pieces of info for the end. I have tried to fine tune the IIS 6 but it did not seem to help out too much.

So does anybody have an idea what the heck is going on, and why my site is crashing every five minutes?

EDIT: Here’s my code in the handler, hope this helps

The BeginProcessRequest is as follows (other than that I am only setting the IsReusable to false):

 Public Function BeginProcessRequest( _
    ByVal context As System.Web.HttpContext, _
    ByVal cb As System.AsyncCallback, _
    ByVal extraData As Object) _
    As System.IAsyncResult _
    Implements System.Web.IHttpAsyncHandler.BeginProcessRequest

    Dim asynch As New AsynchOperation(cb, context, extraData)
    asynch.StartAsyncWork() 

    Return asynch
End Function
  

and then the AsynchOperation class which implements IAsyncResult :

 Class AsynchOperation
Implements IAsyncResult
Private _completed As Boolean
Private _state As [Object]
Private _callback As AsyncCallback
Private _context As HttpContext
Private mre As New ManualResetEvent(False)
Dim br As New Broker.brCSV
Dim brLiveGames As New Broker.brLiveGames

ReadOnly Property IsCompleted() As Boolean _
        Implements IAsyncResult.IsCompleted
    Get
        Return _completed
    End Get
End Property

ReadOnly Property AsyncWaitHandle() As WaitHandle _
        Implements IAsyncResult.AsyncWaitHandle
    Get
        Return Nothing
    End Get
End Property

ReadOnly Property AsyncState() As [Object] _
        Implements IAsyncResult.AsyncState
    Get
        Return _state
    End Get
End Property

ReadOnly Property CompletedSynchronously() As Boolean _
        Implements IAsyncResult.CompletedSynchronously
    Get
        Return False
    End Get
End Property

Public Sub New(ByVal callback As AsyncCallback, _
        ByVal context As HttpContext, _
        ByVal state As [Object])
    _callback = callback
    _context = context
    _state = state
    _completed = False
End Sub

Public Sub StartAsyncWork()
    ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf StartAsyncTask), Nothing)
End Sub

Private Sub StartAsyncTask(ByVal workItemState As [Object])


    Dim fsw As New FileSystemWatcher("D:ClientRootSwatchtimingbvReadData")
    fsw.NotifyFilter = NotifyFilters.LastWrite
    AddHandler fsw.Changed, AddressOf OnChanged
    fsw.EnableRaisingEvents = True
    fsw.IncludeSubdirectories = False

    Dim aTimer As New System.Timers.Timer
    AddHandler aTimer.Elapsed, AddressOf OnTimerChanged
    aTimer.Interval = 60000
    aTimer.Enabled = True
    mre.WaitOne()

    Dim rdr As OleDbDataReader
    Dim i As Integer = 0
    Dim eventName As String = ""
    Dim dsFiles As DataSet = brLiveGames.getFileNameWithEventTitle()
    Dim teamClass As String = "TeamA"
    Dim serveIndicator As String = ""
    Dim serveImage As String = ""
    Dim serveSpeed As String = ""
    Dim fileName As String = ""
    Dim fileNumber As String = ""
    Dim matchID As String = ""
    Dim venueLocation As String = ""
    Dim set1, set2, set3 As String

    For i = 0 To Convert.ToInt16(dsFiles.Tables(0).Rows.Count) - 1
        If eventName <> dsFiles.Tables(0).Rows(i).Item("EventTitle") Then
            eventName = dsFiles.Tables(0).Rows(i).Item("EventTitle")
            _context.Response.Write("<div class='eventTitle'>" amp; eventName.ToString() amp; " <span class='bracketLink'>- <a href='Brackets.aspx?Brackets=" amp; dsFiles.Tables(0).Rows(0).Item("BracketsFile") amp; "'>View brackets</a></span></div>")
        End If
        rdr = br.readCSV(dsFiles.Tables(0).Rows(i).Item("fileName"))

        _context.Response.Write("<div class='matchView'>")
        While (rdr.Read)
            matchID = rdr.Item("Current_Match_Index")
            If venueLocation <> "" Then
                venueLocation = ""
            Else
                venueLocation = br.getVenueLocation(matchID)
                _context.Response.Write("<div class='matchTitle'>"   venueLocation   "</div>")
            End If
            set1 = IIf(IsDBNull(rdr.Item("SET_1")), "amp;nbsp;", rdr.Item("SET_1"))
            set2 = IIf(IsDBNull(rdr.Item("SET_2")), "amp;nbsp;", rdr.Item("SET_2"))
            set3 = IIf(IsDBNull(rdr.Item("SET_3")), "amp;nbsp;", rdr.Item("SET_3"))
            _context.Response.Write("<div class='" amp; teamClass amp; "'>")
            If teamClass <> "TeamB" Then
                teamClass = "TeamB"
            Else
                teamClass = "TeamA"
            End If
            serveIndicator = IIf(IsDBNull(rdr.Item("Service_Indicator")), "", rdr.Item("Service_Indicator"))
            If serveIndicator = "" Then
                serveImage = "<img src='images/css/serveIndicatorNone.png' alt='#' width='14' height='14' />"
            Else
                serveImage = "<img src='images/css/serveIndicator.png' alt='#' width='14' height='14' />"
            End If
            serveSpeed = IIf(IsDBNull(rdr.Item("Serve_Speed")), "amp;nbsp;", "Serve: " amp; rdr.Item("Serve_Speed") amp; " km/h")
            _context.Response.Write("<div class='flag'><img src='images/flags/" amp; rdr.Item("NOC") amp; ".jpg' alt='" amp; rdr.Item("NOC") amp; "' width='22' height='14' /></div><div class='NOC'>" amp; rdr.Item("NOC") amp; "</div><div class='serveIndicator'>" amp; serveImage amp; "</div><div class='teamName'>" amp; rdr.Item("Short_Team_Name") amp; "</div><div class='set1'>" amp; set1 amp; "</div><div class='set2'>" amp; set2 amp; "</div><div class='set3'>" amp; set3 amp; "</div><div class='serveSpeed'>" amp; serveSpeed amp; "</div>")
            _context.Response.Write("</div>")
        End While
        _context.Response.Write("</div>")
        rdr.Close()
    Next
    fsw.Dispose()
    dsFiles.Dispose()
    _context.Response.End()

    _completed = True
    _callback(Me)

End Sub

Private Sub OnChanged(ByVal sender As Object, ByVal e As FileSystemEventArgs)
    mre.Set()
End Sub

Private Sub OnTimerChanged(ByVal sender As Object, ByVal e As ElapsedEventArgs)
    mre.Set()
End Sub

End Class
  

Edit #2: The code for the Broker.brCSV.readCSV(fileName)

 Public Function readCSV(ByVal fileName As String) As OleDbDataReader
    Dim rdr As OleDbDataReader = Nothing
    Dim folderName = ("FolderName")
    Dim cnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" amp; folderName amp; ";Extended Properties='text;HDR=Yes;FMT=Delimited';Mode=3"

    Dim cn As New OleDb.OleDbConnection(cnString)
    Dim cm As New OleDb.OleDbCommand("Select * from " amp; fileName, cn)
    cm.Connection.Open()
    rdr = cm.ExecuteReader(System.Data.CommandBehavior.CloseConnection)

    Return rdr
End Function
  

Please observe the ending of the connection string, specifically the Mode parameter. The msdn states that this is how you specify the file access permissions, but it could be that I did not interpret the instructions in the right way… Namely, mode=3 is supposed to specify the file access as read/write but I’m not sure if it works.

EDIT #3: The new Broker.brCSV.readCSV() throws an InvalidOperationException

As per the suggestions of the kind helper Smudge202 I have altered the code of the Broker.brCSV.readCSV method as follows:

 Public Function readCSV(ByVal fileName As String) As OleDbDataReader
    Dim folderName = ("Folder Name")
    Dim cnString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" amp; folderName amp; ";Extended Properties='text;HDR=Yes;FMT=Delimited';Mode=3"

    Using cn As New OleDb.OleDbConnection(cnString)
        Using cm As New OleDb.OleDbCommand("Select * from " amp; fileName, cn)
            cm.Connection.Open()
            Dim rdr As OleDbDataReader = cm.ExecuteReader(System.Data.CommandBehavior.CloseConnection)
            Return rdr
        End Using
    End Using

End Function
  

However, when tested this code caused the following errors:

Event Type: Error
Event Source: ASP.NET 4.0.30319.0
Event Category: None
Event ID: 1325
Date: 22/04/2011
Time: 08:46:33
User: N/A
Computer: EUW0002184
Description:
An unhandled exception occurred and the process was terminated.

Application ID: /LM/W3SVC/1/ROOT

Process ID: 6408

Exception: System.InvalidOperationException

Message: Invalid attempt to call Read when reader is closed.

Отслеживание стека: в System.Data.OleDb.OleDbDataReader.Read() при настройке времени выборки.Асинхронная работа.Запустите synctask (объект workItemState) в системе.Потоковая обработка.Обратный вызов QueueUserWorkItemCallback.WaitCallback_Context (состояние объекта) в системе.Потоковая обработка.ExecutionContext.runTryCode(пользовательские данные объекта) в System.Runtime.Службы компилятора.RuntimeHelpers.Запустите CODE с гарантией очистки (TryCode code, CleanupCode backoutCode, Object userData) в системе.Потоковая обработка.ExecutionContext.Выполнить внутренний (ExecutionContext ExecutionContext, обратный вызов ContextCallback, состояние объекта) в системе.Потоковая обработка.ExecutionContext.Run (ExecutionContext ExecutionContext, обратный вызов ContextCallback, состояние объекта, логическое игнорирование SyncCtx) в системе.Потоковая обработка.Обратный вызов QueueUserWorkItemCallback.Система.Потоковая обработка.IThreadPoolWorkItem.ExecuteWorkItem() в системе.Потоковая обработка.ThreadPoolWorkQueue.Отправка () в систему.Потоковая обработка._ThreadPoolWaitCallback.Выполните Waitcallback()

а также:

Тип события: Ошибка Источник события: .NET Runtime Категория события: Отсутствует Идентификатор события: 1026 Дата: 22/04/2011 Время: 08:47:53 Пользователь: N / A Компьютер: EUW0002184 Описание: Приложение: w3wp.exe Версия платформы: v4.0.30319 Описание: Процесс был завершен из-за необработанного исключения. Информация об исключении: Система.Стек исключений InvalidOperationException: в System.Data.OleDb.OleDbDataReader.Read() при настройке времени выборки.Асинхронная работа.StartAsyncTask (система.Объект) в системе.Потоковая обработка.Обратный вызов QueueUserWorkItemCallback.WaitCallback_Context (система.Объект) в системе.Потоковая обработка.ExecutionContext.runTryCode (Системный.Объект) в System.Runtime.Службы компилятора.RuntimeHelpers.Выполните код с гарантированной очисткой (TryCode, CleanupCode, System.Объект) в системе.Потоковая обработка.ExecutionContext.RunInternal (система.Потоковая обработка.ExecutionContext, System.Потоковая обработка.ContextCallback, системный.Объект) в системе.Потоковая обработка.ExecutionContext.Run(Система.Потоковая обработка.ExecutionContext, System.Потоковая обработка.ContextCallback, системный.Объект, логическое значение) в системе.Потоковая обработка.Обратный вызов QueueUserWorkItemCallback.Система.Потоковая обработка.IThreadPoolWorkItem.ExecuteWorkItem() в системе.Потоковая обработка.ThreadPoolWorkQueue.Отправка () в систему.Потоковая обработка._ThreadPoolWaitCallback.Выполните Waitcallback()

Итак, когда обработчик пытается использовать новый метод readCSV, я получаю эти ошибки… Есть еще предложения? 🙂 Спасибо тебе, Размазня, и спасибо всем остальным!

Комментарии:

1. Похоже, что трассировка стека вашего исключения указывает на поставщика OleDb, который, как я полагаю, является поставщиком, который вы используете для чтения входящих CSV-файлов? На каком этапе вы извлекаете данные из CSV-файлов? Из вашего описания кажется возможным, что несколько потоков пытаются использовать провайдера одновременно, что приведет к исключению IOException внутри провайдера (хотя, честно говоря, я бы надеялся увидеть это в stacktrace). Кроме того (извините за длинный комментарий), являются ли потоки, которые вы удерживаете в waithandle для IHttpAsyncHandler, все еще активными, когда они получают сигнал? (Тайм-аут?)

2. @Smudge202 Спасибо за ваш ответ, Smudge. Я извлекаю данные, как только наблюдатель файловой системы замечает изменения в исходной папке. Я отредактирую свой пост, чтобы добавить код, чтобы вы могли внимательно его просмотреть, если хотите… Еще раз спасибо!

3. Спасибо за добавление вашего кода. Не могли бы вы также добавить код для «Broker.brCSV.readCSV(String fileName)», который является функцией, вызываемой вами в StartAsyncTask, которая вызывает проблему (см. stacktrace). Еще пара моментов. Цикл не нужно приводить к Int16, строкам. Количество уже является целым числом. Кроме того, вы можете полностью избавиться от таймера и использовать перегруженный mre. Ожидание (msTimeout). Объедините это с Dim filesChanged как Boolean = mre. Подождите один (60000), чтобы узнать, действительно ли файлы изменились?

4. @Smudge202, тысяча благодарностей за то, что уделили свое время изучению этого 🙂 Я внесу изменения, которые вы предложили для замены таймера, и я снова отредактирую исходное сообщение, чтобы предоставить код для Broker.brCSV.readCSV(fileName). Еще раз благодарю вас!

5. @Smudge202, Обновление: Сегодня я еще немного поиграл с настройкой IIS, и, наконец, кажется, что все действительно работает. Я все же воспользовался вашим советом и благодарю вас за это. Однако, если вы обнаружите что-то неприятное в той части кода, которую я опубликовал после вашего запроса, пожалуйста, скажите, что мне нужно исправить. Еще раз большое спасибо…

Ответ №1:

В дополнение к одному или двум комментариям, которые я добавил до сих пор …. =)

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

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

В вашем случае вы открываете и закрываете соединение в функции readCSV, затем передаете закрытое средство чтения обратно в «StartAsyncTask». Что вы могли бы сделать, возможно, это небольшой рефакторинг… Вместо использования OleDbDataReader вы могли бы использовать OleDbDataAdapter. Используя адаптер, вы можете вызвать метод Fill для заполнения набора данных.

Как только набор данных заполнен, он находится в памяти. Вы можете закрыть адаптер, разорвать соединение, удалить оба (инструкции ‘using’) и передать набор данных обратно вашему методу startAsync?

Прокомментируйте здесь, если вам нужны какие-либо примеры этого.

Удачи!

Редактировать:

Краткое замечание о выполняемой вами работе по многопоточности…

Что касается настроек IIS, если вы запускаете свой веб-сайт более чем в одном процессе, имейте в виду, что на каком-то этапе у вас, вероятно, будет 2 процесса (или более) sat, ожидающих наблюдателя файловой системы. Когда FSW обнаружит изменение, он уведомит оба ваших процесса; в непредсказуемом порядке, но, вероятно, в быстрой последовательности, что, в свою очередь, приведет к тому, что два отдельных потока начнут чтение файлов. Вы можете столкнуться с проблемами на этом этапе, когда два потока запрашивают поставщика Jet открыть один и тот же файл (ы) одновременно. Убедитесь, что у вас есть много логики отслеживания исключений, которая поможет.

Возможно, вам даже придется рассмотреть возможность использования мьютексов, если это касается вас, чтобы разрешить обрабатывать результаты одному процессу за раз, но я редко поощряю это.

Что касается исключений потоков, взгляните на эту статью, которая, как я полагаю, все еще актуальна в IIS7.5 / .Net 4. Будьте очень осторожны со своими рабочими потоками, исключения могут привести к закрытию веб-сайта, если их не перехватить.

Комментарии:

1. Благодарим вас за постоянную поддержку. Я надеюсь, что вы получаете от этого хоть какое-то духовное удовлетворение 🙂 В любом случае, что касается настроек IIS, я не разрешил приложению использовать два процесса (я полагаю, это называется web garden). Из-за первоначальных проблем с доступом к файлу (и сообщения «другой процесс заблокировал файл») мне показалось логичным, что то же самое может произойти, если я просто включу более одного процесса, запускающего приложение. Я подготовил версию 2.0 с учетом ваших предложений и протестирую ее сегодня вечером. Я дам вам знать, как это получилось…

2. в дополнение к этому, что забавно, так это то, что в другой операции я использовал oledbdataadapter, но не в основном … конечно, эта часть приложения никогда не вызывала у меня никаких проблем 🙂 отсюда и мой ник, я полагаю…

3. Ха-ха, ну, по крайней мере, у вас уже есть весь шаблонный код для использования адаптера. Исправьте в веб-саду примечание, если вам нужен такой подход, я бы предложил удалить код FSW и поместить в службу WCF, чтобы позволить одному процессу ООП управлять файлами. Как и прежде, удачи.

4. что ж, учитывая, что я многому научился с помощью этого приложения, и то, что я пока ничего не делал в wcf, я мог бы попробовать это предложение просто как учебный проект… Спасибо за добрые пожелания 🙂