无法访问已处置的对象:System.Threading.ManualResetEvent

时间:2016-03-02 22:57:24

标签: c# .net f# mono

我有一个小应用程序启动了几个async工作流,这些工作流可以读取和写入Kafka主题。当我启动超过3或4个异步进程时,我收到以下错误:

System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Threading.ManualResetEvent'.

我无法弄清楚是什么导致抛出此异常或实际触发了什么资源。我在代码中的任何地方都不使用ManualResetEvent。该程序适用于3或异步任务,但当我尝试更多时,抛出异常,因此触发它的内容不一致。在我的代码中,异常的来源也没有任何意义。

这是用于创建异步任务的代码:

let service name readsFrom writeTo (delay:int) =
let producer = createKafkaProducer name
let subscription = createKafkaSubscriber name readsFrom
async{
    printfn "Starting %s" name
    try
        subscription |> Seq.iter
            (fun m -> 
                try
                    let e = m.Message
                    // biz logic
                    producer.Send(new Kafka.Client.Producers.KeyedMessage<string,string>(t, message))
                    Thread.Sleep 500 
                 with
                 | e -> printfn "%s" (e.Message))
      with
      | e -> printfn "%s" (e.Message)}

异常的堆栈跟踪如下所示,带有try / catch的事件阻塞了所有异步逻辑,这是我能够获得的。我相信这可能是我正在使用的jroland Kafka客户端库的一个问题:

Unhandled Exception:
System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Threading.ManualResetEvent'.
  at System.Threading.WaitHandle.CheckDisposed () <0x7fac94651690 + 0x00050> in <filename unknown>:0
  at System.Threading.EventWaitHandle.Set () <0x7fac9464b490 + 0x0003a> in <filename unknown>:0
  at (wrapper remoting-invoke-with-check) System.Threading.EventWaitHandle:Set ()
  at System.Net.Sockets.SocketAsyncResult.set_IsCompleted (Boolean value) <0x414118b0 + 0x00112> in <filename unknown>:0
  at System.Net.Sockets.SocketAsyncResult.Complete () <0x414114a0 + 0x000df> in <filename unknown>:0
  at System.Net.Sockets.SocketAsyncResult.Complete (System.Exception e) <0x41411420 + 0x0004b> in <filename unknown>:0
  at System.Net.Sockets.SocketAsyncWorker.Connect () <0x41410d80 + 0x003eb> in <filename unknown>:0
  at System.Net.Sockets.SocketAsyncWorker.DispatcherCB (System.Net.Sockets.SocketAsyncResult sar) <0x41410ab0 + 0x000af> in <filename unknown>:0
  at (wrapper managed-to-native) System.Runtime.Remoting.Messaging.AsyncResult:Invoke (System.Runtime.Remoting.Messaging.AsyncResult)
  at System.Net.Sockets.SocketAsyncResult.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () <0x41410760 + 0x00024> in <filename unknown>:0
  at System.Threading.ThreadPoolWorkQueue.Dispatch () <0x7fac944b3e50 + 0x001d6> in <filename unknown>:0
  at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback () <0x7fac944b56c0 + 0x00008> in <filename unknown>:0

这种行为似乎违反了我对.Net中闭包如何工作的理解。因为对象是在lambda中使用的,所以它不应该在闭包内被有效捕获并保持活着直到lambda被处理掉?

0 个答案:

没有答案