C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■92329 / 7階層)  スレッドをタスクで書くには
□投稿者/ 魔界の仮面弁士 (2373回)-(2019/09/10(Tue) 20:36:13)
2019/09/10(Tue) 21:05:58 編集(投稿者)

No92328 (TanuTanu さん) に返信
> 別クラスでShared使っていたので、これを止めてForm1渡せば上手くいきました。

Shared やフィールド変数は、スレッド間で無闇に共有しないほうが良いのですけれどね。

で… Form1 はスレッドセーフなオブジェクトではありません。
DataSet は、読み取りに関してのみスレッドセーフが保証されていますが、
Form のメンバーは、たとえ読み取りのみであってもスレッドセーフではありませんので、
Form1 を非 UI スレッドに渡さないようにしてください。



> ただまだ解っていないところがありまして、Timer1_Tickを使っているのですが
> Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
> DIM _他クラス AS NEW 他クラス(Form1)

念のためにお聞きしますが、「他クラス」の中でワーカースレッドを起動して、
その中で、引数の Form1 インスタンスを利用していたりはしないですよね?


それはさておき、「New 他クラス(Form1)」と呼び出した場合の Form1 は、
データ型としての Form1 クラスのことではなく、
VB 固有の My.Forms.Form1 プロパティ相当の意味になりますよね。

いわゆる「既定のフォーム インスタンス」などと呼ばれる機能ですが、
この方式での Form へのアクセスは避けることを強くお奨めします。
マルチスレッドでの開発を手がけようというのであれば。


> のような使い方は、_他クラス=NOTHINGをしないと
> _他クラスのインスタンスが増殖してしまうと思っていいのでしょうか?

Nothing 代入は不要です。
使用している変数 `_他クラス` はローカル変数なので、
何もせずとも、End Sub 到達時点で自動的に処分されます。

解放前に適切な終了処理が必要なもの(たとえば IDisposable など)の場合は、
Finally 等を併用するべきですが、そうでないなら作りっぱなしで構いません。

もし仮に、すべてのクラスが Nothing 代入を必要とするのだとしたら、
As String な変数一つ一つにも Nothing しなければならないという事になってしまいます。


ただ、そもそも「他クラス」のインスタンスを Tick イベントのたびに New しなおす必要が
あるかどうかも検討してみてください。処理内容によっては、「他クラス」のインスタンスを
フィールド変数などとして保持しておき、イベント側ではそれを使いまわすだけで十分かもしれません。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[6]: スレッドをタスクで書くには /TanuTanu →Re[8]: スレッドをタスクで書くには /TanuTanu
 
上記関連ツリー

スレッドをタスクで書くには / TanuTanu (19/09/10(Tue) 11:53) #92298
Re[1]: スレッドをタスクで書くには / WebSurfer (19/09/10(Tue) 12:51) #92299
│└ Re[2]: スレッドをタスクで書くには / TanuTanu (19/09/10(Tue) 14:00) #92301
│  ├ Re[3]: スレッドをタスクで書くには / 魔界の仮面弁士 (19/09/10(Tue) 14:12) #92302
│  └ Re[3]: スレッドをタスクで書くには / WebSurfer (19/09/10(Tue) 14:30) #92304
│    └ Re[4]: スレッドをタスクで書くには / WebSurfer (19/09/10(Tue) 14:52) #92305
Re[1]: スレッドをタスクで書くには / 魔界の仮面弁士 (19/09/10(Tue) 13:35) #92300
  └ Re[2]: スレッドをタスクで書くには / TanuTanu (19/09/10(Tue) 14:28) #92303
    ├ Re[3]: スレッドをタスクで書くには / TanuTanu (19/09/10(Tue) 15:24) #92308
    │└ Re[4]: スレッドをタスクで書くには / WebSurfer (19/09/10(Tue) 15:50) #92313
    └ Re[3]: スレッドをタスクで書くには / 魔界の仮面弁士 (19/09/10(Tue) 16:09) #92316
      └ Re[4]: スレッドをタスクで書くには / TanuTanu (19/09/10(Tue) 16:41) #92322
        └ Re[5]: スレッドをタスクで書くには / 魔界の仮面弁士 (19/09/10(Tue) 17:01) #92324
          └ Re[6]: スレッドをタスクで書くには / TanuTanu (19/09/10(Tue) 18:55) #92328
            └ スレッドをタスクで書くには / 魔界の仮面弁士 (19/09/10(Tue) 20:36) #92329 ←Now
              └ Re[8]: スレッドをタスクで書くには / TanuTanu (19/09/10(Tue) 23:37) #92330 解決済み
                ├ Re[9]: スレッドをタスクで書くには / WebSurfer (19/09/11(Wed) 10:43) #92337
                └ Re[9]: スレッドをタスクで書くには / WebSurfer (19/09/11(Wed) 13:00) #92342

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信