1.C#、VB.NET-4.フォームアプリケーション非同期処理中はスレッドセーフでなければアクセス出来ないことは以前説明しました。sasaki816.hatenablog.com今回は同じような内容ですが、非同期でフォームを開いたり閉じたりする処理を考えます。ボタンクリックを非同期処理で行い、その別スレッドの処理中に新しいフォームを開き、5秒後に閉じるような処理です。同期処理の場合は以下となります。Subこのような単純な処理です。非同期処理はThreadでやって出来ないことはないですが、Task.Factory.StartNewを使用するのがベストでしょう。フォームオープン処理を別スレッドで実行できるようにメソッドを外だしします。Sub一見全く問題ないように見えますが、これを実行すると新しく開いたフォーム(SubForm)が固まったようになります。これはフォームがスレッドセーフではない為に発生する現象です。ボタンクリック以下のFormOpenメソッドは別スレッドで実行されていますが、フォームを開く行為は同期処理となります。よって次の処理であるSystem.Threading.Thread.Sleep(5000)が実行されると、スレッド自体はその処理を待ってしまうのです。これを回避するためには、以前説明したラベルの表示を非同期で切り替える方法と同様でInvokeメソッドに頼ることになります。InvokeメソッドからOpne/Closeメソッドを実行することで、別スレッドでフォームの描画を実行させる形です。Framework4.5以上の場合async/awaitが使用できるので、Invokeメソッドに頼ることなくより安全に且つ簡単に別スレッドからUIへアクセスできます。ボタンクリックイベント自体をasyncにしているので、フォームOpen/Close処理をawaitの外にだしてあげます。Subなお、フォーム操作を別スレッドでするのは動作上好ましくない(危険な)場合が多いので、非同期処理を深く理解していない状態で安易に非同期で実行することはあまりおすすめしません。1(共通処理)デリゲートは作成するアプリケーションの性質によっては全くお...2019-02-08非同期処理、マルチスレッド(async/await)非同期処理最終話です。Javascriptからクリップボードを設定はてなブログをはじめよう!sasaki816さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。