回答編集履歴

4

理解しやすい別案を追記しておきます。

2024/12/23 11:41

投稿

hqf00342
hqf00342

スコア374

test CHANGED
@@ -44,7 +44,7 @@
44
44
 
45
45
  ### 追記
46
46
 
47
- 別案も書いておきます。 `ProgressHub.cs`の変更だけなのでこちらのほが明快かも。
47
+ 別案も書いておきます。 こちらのほうが`ProgressHub.cs`の変更の、別スレッド内でどすべきかも理解しやすいかも
48
48
 
49
49
  ```cs:ProgressHub.cs
50
50
  public class ProgressHub(IServiceScopeFactory factory) : Hub

3

追記:

2024/12/23 11:36

投稿

hqf00342
hqf00342

スコア374

test CHANGED
@@ -41,3 +41,23 @@
41
41
 
42
42
  重たい処理の内容が分からないのでそのままThreadPoolで実行する例にしましたが、
43
43
  処理内容によっては重たい処理はBackgourndServiceとして登録、待機し、それをSignalR契機で起動させるような形のほうが適しているかもしれません。
44
+
45
+ ### 追記
46
+
47
+ 別案も書いておきます。 `ProgressHub.cs`の変更だけなのでこちらのほうが明快かも。
48
+
49
+ ```cs:ProgressHub.cs
50
+ public class ProgressHub(IServiceScopeFactory factory) : Hub
51
+ {
52
+ public void SendMessage(string user, string message) {
53
+ _ = Task.Run(() => {
54
+ using var scoped = factory.CreateScope();
55
+ var hub = scoped.ServiceProvider.GetRequiredService<IHubContext<ProgressHub>>();
56
+ var client = hub.Clients.Client(user);
57
+ ThreadMethod(client, 500);
58
+ });
59
+ }
60
+ static void ThreadMethod(IClientProxy cl, int delay) {
61
+ //変更なし
62
+ }
63
+ ```

2

サービス登録をシングルトンに変更

2024/12/23 04:10

投稿

hqf00342
hqf00342

スコア374

test CHANGED
@@ -23,7 +23,7 @@
23
23
  ##### 2.HeavyWork クラスをサービス登録
24
24
  作ったクラスをサービス登録。Program.cs の var app = builder.Build();より前に1行追記
25
25
  ```cs:Program.cs
26
- builder.Services.AddScoped<HeavyWork>();
26
+ builder.Services.AddSingleton<HeavyWork>();
27
27
  ```
28
28
 
29
29
  ##### 3.ProgressHub クラス修正

1

誤字修正

2024/12/22 09:13

投稿

hqf00342
hqf00342

スコア374

test CHANGED
@@ -3,7 +3,7 @@
3
3
  対策案として、ThreadMethod()にuser名(文字列)を渡して、普通にSignalRとして送信するメソッドを作ります。また現代のC#では new Thread()はしないのでそれも修正します。
4
4
 
5
5
  ##### 1.ThreadMethod()をクラス に切り出し
6
- 別のクラス `HeavyWork` を作り重たい処理を移動。SignalR送信用にProgressHubを注入。
6
+ 別のクラス `HeavyWork` を作り重たい処理を移動。SignalR送信用にIHubContextを注入。
7
7
  ```cs:HeavyWork
8
8
  public class HeavyWork(IHubContext<ProgressHub> hub)
9
9
  {
@@ -29,7 +29,7 @@
29
29
  ##### 3.ProgressHub クラス修正
30
30
  ThreadPoolを使って実行。
31
31
  ```cs:ProgressHub.cs
32
- public class ChatHub(HeavyWork heavy) : Hub
32
+ public class ProgressHub(HeavyWork heavy) : Hub
33
33
  {
34
34
  public void SendMessage(string user, string message)
35
35
  {