実現したいこと
VS2022 .Net Core 8.0 ASP.NET Core Webアプリ(Razor Pages)で
公式チュートリアルのチャットを少し改造してサーバタスクの進捗表示を行おうとしています。
サーバ側処理を別スレッドとして行おうとすると Hub の Clients.Client 参照で例外が発生してしまいます。
参照:
https://learn.microsoft.com/ja-jp/aspnet/core/tutorials/signalr?view=aspnetcore-3.1&tabs=visual-studio
発生している問題・分からないこと
ボタン押下1回目の処理はOKですが2回目で以下 Clients が Disposed されているというエラーになってしまします。
何か解決策お分かりの方いらっしゃいますでしょうか?
エラーメッセージ
error
1Clients = 'Clients' は型 'System.ObjectDisposedException' の例外をスローしました 2例外がスローされました: 'System.ObjectDisposedException' (System.Private.CoreLib.dll の中) 3型 'System.ObjectDisposedException' の例外が System.Private.CoreLib.dll で発生しましたが、ユーザー コード内ではハンドルされませんでした 4Cannot access a disposed object.
該当のソースコード
ProgressHub.cs
1public class ProgressHub : Hub 2{ 3 static void ThreadMethod(IClientProxy cl, int delay) // ★これは追加 4 { 5 for (int i = 0; i < 5; i++) 6 { 7 Thread.Sleep(delay); 8 cl.SendAsync("ReceiveMessage", "notify", $"msg-{i}"); 9 } 10 } 11 public async Task SendMessage(string user, string message) 12 { 13 // ★ここを変更 14 //await Clients.Client(user).SendAsync("ReceiveMessage", user, message); 15 Thread thread1 = new Thread(() => ThreadMethod(Clients.Client(user), 500)); //ここで例外 16 thread1.Start(); 17 // これは何回やっても問題なし 18 // ThreadMethod(Clients.Client(user), 500); 19 20 await Task.Delay(0); 21 } 22} 23
Program.cs
1//.NET8.0 では Setup.cs が無くなってますが Program.cs に同じ内容を書けば良い様です。 2// Add services to the container. 3builder.Services.AddRazorPages(); 4builder.Services.AddSignalR(); // ★ここを変更 5 ・・・ 6app.MapRazorPages(); 7app.MapHub<ProgressHub>("/progressHub"); // ★ここを変更 8 ・・・ 9
index.cshtml
1document.getElementById("sendButton").addEventListener("click", function (event) { 2 //var user = document.getElementById("userInput").value; 3 var user = connection.connection.connectionId; // ★ここを変更 4 var message = document.getElementById("messageInput").value; 5 connection.invoke("SendMessage", user, message).catch(function (err) { 6 return console.error(err.toString()); 7 }); 8 event.preventDefault(); 9}); 10
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
別スレッドにしなければOKなのですが、リクエストが戻ってくるまでクライアントから別のリクエストをすることができないので困っています。
補足
特になし
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/12/22 12:17
2024/12/23 04:39
2024/12/23 23:51