回答編集履歴
4
理解しやすい別案を追記しておきます。
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
追記:
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
サービス登録をシングルトンに変更
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.AddS
|
26
|
+
builder.Services.AddSingleton<HeavyWork>();
|
27
27
|
```
|
28
28
|
|
29
29
|
##### 3.ProgressHub クラス修正
|
1
誤字修正
test
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
対策案として、ThreadMethod()にuser名(文字列)を渡して、普通にSignalRとして送信するメソッドを作ります。また現代のC#では new Thread()はしないのでそれも修正します。
|
4
4
|
|
5
5
|
##### 1.ThreadMethod()をクラス に切り出し
|
6
|
-
別のクラス `HeavyWork` を作り重たい処理を移動。SignalR送信用に
|
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
|
32
|
+
public class ProgressHub(HeavyWork heavy) : Hub
|
33
33
|
{
|
34
34
|
public void SendMessage(string user, string message)
|
35
35
|
{
|