質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

7561閲覧

非同期処理時にプログレスバーとかを更新する方法

xail2222

総合スコア1508

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2021/12/29 08:33

編集2021/12/29 13:35

前提・実現したいこと

非同期処理時にプログレスバーとかを更新したい。

一応、現在のコードでそれっぽく動いているのですが
思い付きでの構成のため、これが普通なのかよくわかっていません。

他のやり方などあれば教えて下さい。

現在のコード

開始用のbrnStartボタン
キャンセル用のbtnCancelボタン
プログレスバーを更新する為のTimer1コントロール
プログレスバーのProgressBar1

をFormにセットして以下のようなコードで実装しています。

VBNET

1 2Public Class Form1 3 4 Private m_Count As Long 5 6 Private Sub brnStart_Click(sender As Object, e As EventArgs) Handles brnStart.Click 7 8 ProgressBar1.Maximum = 20 9 ProgressBar1.Minimum = 0 10 ProgressBar1.Value = 0 11 12 Timer1.Interval = 1000 13 Timer1.Start() 14 m_Count = 0 15 16 Dim t As Task = Task.Run( 17 Sub() 18 何か重い処理() 19 End Sub) 20 21 End Sub 22 23 Private Sub 何か重い処理() 24 For i = 0 To 20 25 System.Threading.Thread.Sleep(2000) 26 If m_Count < 0 Then 27 Exit Sub 28 End If 29 m_Count = m_Count + 1 30 Next 31 m_Count = -1 32 End Sub 33 34 Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 35 If m_Count < 0 Then 36 Timer1.Stop() 37 If m_Count = -1 Then 38 MsgBox("処理完了") 39 End If 40 Exit Sub 41 End If 42 ProgressBar1.Value = m_Count 43 End Sub 44 45 Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click 46 If MsgBox("キャンセルしますか?", MsgBoxStyle.OkCancel) = MsgBoxResult.Ok Then 47 m_Count = -2 48 End If 49 End Sub 50End Class 51

補足情報(FW/ツールのバージョンなど)

Visual Studio 2015

追記

ついでにコメントでキャンセル時の処理の仕方も質問してしまいました。
コメントにて、そのUrlの紹介を頂いています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下の記事は参考になりませんか?

WPF/Windowsフォーム:時間のかかる処理をバックグラウンドで実行するには?
https://www.atmarkit.co.jp/ait/articles/1512/02/news019.html

投稿2021/12/29 09:18

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xail2222

2021/12/29 09:25

回答ありがとうございます。 参考になりそうです。 提示のUrlを参考に試してみます。
xail2222

2021/12/29 10:05

出来ました。 とりあえずAwaitで私の用途的に問題なさそうなのでこれで大丈夫です。 あと、、、ここで聞くのは不適切な気もしますが新たに質問立てるのも。。。ということで、キャンセルボタンの対応をする場合は何かいい方法はあるのでしょうか。 今と変わらず、キャンセルボタン押下したらFormのPrivate変数を立てて、処理を止めるという感じでしょうか。
xail2222

2021/12/29 13:47 編集

十分です。Urlありがとうございます。 思ってたより内容が多いですね。(1),(2)は直感的にわかりやすいですね。 これが私にはしっくりきました。 (3)は、私の例と似てますね。 ただ、クラスにして処理とキャンセルフラグをまとめることで変数が整理されているのかな。な気がします。 (4)はManualResetEventSlimがよく理解できないので、まだよくわからないです。が ちょっとキャンセル時のthrowはあってるのか?という感じがしました。 それぞれ実際に試してみます。 まことに勉強になりました。 不作法失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問