前提・実現したいこと
VB.NETでネットワークの通信とプロセス間通信をしています。
クライアントからデータを送信して、サーバーで受信用プログラムが受信して、データを保管。印刷用プログラムが保管されたデータから印刷にいくようなプログラムを作成しています。
プログラム自体は作成できたのですが、受信用プログラムが別スレッドで動かさないと、「アプリケーションはブレイクモードになりました」みたいなメッセージがでてきて止まってしまいます。
動作はしているのですが、同じプログラムなのに、スレッドの実装の仕方で、動作がおかしくなる原因が分からず困っています。
(データを大量に受信して、データを保管、印刷用のプログラムを起動して、大量にデータ読み込むと、おきます。)
発生している問題・エラーメッセージ
アプリケーションはブレークモードになっています。
例外がスローされました。
マネージド デバッグ アシスタント 'ContextSwitchDeadlock' : 'CLR は、COM コンテキスト 0xe37288 から COM コンテキスト 0xe371d0 へ 60 秒で移行できませんでした。ターゲット コンテキストおよびアパートメントを所有するスレッドが、ポンプしない待機を行っているか、Windows のメッセージを表示しないで非常に長い実行操作を処理しているかのどちらかです。この状態は通常、パフォーマンスを低下させたり、アプリケーションが応答していない状態および増え続けるメモリ使用を導く可能性があります。この問題を回避するには、すべての Single Thread Apartment (STA) のスレッドが、CoWaitForMultipleHandles のようなポンプする待機プリミティブを使用するか、長い実行操作中に定期的にメッセージをポンプしなければなりません。'
該当のソースコード
データ受信用のプログラム
Sub Main() (省略) ・・・・・ Dim channel As New IpcServerChannel("Sample") ChannelServices.RegisterChannel(channel, True) RemotingServices.Marshal(RemoteObject, "Sample", GetType(PrintSpool.PrintSpool)) Dim isEndFlg As Boolean = False While (True) '接続待ち While Not listener.Pending If True = Console.KeyAvailable() Then isEndFlg = True Exit While End If End While If True = isEndFlg Then Exit While End If '問題なく動作する。 'Dim myThread As Thread = New Thread(New ThreadStart(AddressOf DoWorkXML)) 'myThread.Start() 'こっちはアプリケーションはブレイクモードになっていますとでて、メモリがどんどん増えていく。 DoWorkXML() 'こっちもアプリケーションはブレイクモードになっていますとでて、メモリがどんどん増えていく。 'Task.Run(Sub() ' DoWorkXML() ' End Sub) End While End Sub .... Friend Sub DoWorkXML() Dim obj As PrintSpool.XmlData = Nothing Try 'XmlSerializerオブジェクトを作成 Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(PrintSpool.XmlData)) Dim xmlSettings = New System.Xml.XmlReaderSettings() _ With { .CheckCharacters = False } Using client = listener.AcceptTcpClient() Console.WriteLine("Client connected completed") Using ns As NetworkStream = client.GetStream() ns.ReadTimeout = 10000 If ns.CanRead Then Using xmlReader As Xml.XmlReader = System.Xml.XmlReader.Create(ns, xmlSettings) RemoteObject.data = CType(serializer.Deserialize(xmlReader), PrintSpool.XmlData) End Using Else client.Close() ns.Close() End If ns.Close() ns.Dispose() End Using End Using Catch ex As Exception Console.WriteLine(ex.Message) Finally End Try End Sub 印刷用のプログラム Sub Main() Dim channel As New IpcClientChannel() ChannelServices.RegisterChannel(channel, True) Dim sp = TryCast(Activator.GetObject(GetType(PrintSpool.PrintSpool), "ipc://Sample/Sample"), PrintSpool.PrintSpool) While (True) If 0 < sp.Count Then Try Dim getData As PrintSpool.XmlData = sp.data Console.WriteLine("key=" & getData.key) Console.WriteLine("value=" & getData.value) For Each row In getData.dt.Rows For i As Integer = 0 To 1 Console.WriteLine("dt " & row(i)) Next Next getData = Nothing Catch ex As Exception Console.WriteLine("Received:fail") End Try End If 'Catch ex As Exception 'End Try End While End Sub
試したこと
同じDoWorkXMLをメインスレッドなどで起動して、動作確認しました。
メインスレッドはNG
task.runはNG
スレッドOK
スレッドプールOK
タイマーOK
Using ns As NetworkStream = client.GetStream()
を実行して、中身何もなしでも、同じような症状。
補足情報(FW/ツールのバージョンなど)
VS2017
回答1件
あなたの回答
tips
プレビュー