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

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

新規登録して質問してみよう
ただいま回答率
85.46%
VB.NET

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

Q&A

解決済

1回答

1195閲覧

VB background処理について windows, Visual Studio 2017、.NET Framework

sakaka

総合スコア15

VB.NET

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

0グッド

0クリップ

投稿2021/06/04 00:48

編集2021/06/04 06:19

いつもお世話になっております。
現在ファイルアップローダーを作っている途中です。そこでは、background処理を用いて、非同期処理を行っています。backgroundに中断、再開機能をつ- リストけたいのですがうまくいきません。一応下記のようなことは試してみました。
1 BackgroundWorker1.CancelAsync()
2 System.Threading.Thread.Sleep(Thread.Sleep.infinity)
3 pause = True ,pause = False
どうぞよろしくお願いいたします。

Public

1#Region "変数宣言" 2 Private m_strBtnchange As String = "no" 3 Private m_folder As New FolderBrowserDialog 4 Private m_strfile As String 5 Private pause As Boolean = False 6 Private idx As Integer = 0 7#End Region 8#Region "ボタンイベント" 9 ''' <summary> 10 ''' アップロード開始 11 ''' </summary> 12 ''' <param name="sender"></param> 13 ''' <param name="e"></param> 14 Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click 15 If m_strBtnchange = "ok" Then 16 btn1.Text = "再開" 17 m_strBtnchange = "no" 18 ElseIf m_strBtnchange = "no" Then 19 btn1.Text = "中断" 20 m_strBtnchange = "ok" 21 BackgroundWorker1.RunWorkerAsync() 22 End If 23 End Sub 24 ''' <summary> 25 ''' フォルダの表示 26 ''' </summary> 27 ''' <param name="sender"></param> 28 ''' <param name="e"></param> 29 Private Sub btn2_Click(sender As Object, e As EventArgs) Handles btn2.Click 30 Try 31 'FolderBrowserDialogクラスのインスタンスを作成 32 '上部に表示する説明テキストを指定する 33 m_folder.Description = "フォルダを指定してください。" 34 'ルートフォルダを指定する 35 'デフォルトでDesktop 36 m_folder.RootFolder = Environment.SpecialFolder.Desktop 37 '最初に選択するフォルダを指定する 38 'RootFolder以下にあるフォルダである必要がある 39 m_folder.SelectedPath = "C:\Windows" 40 'ユーザーが新しいフォルダを作成できるようにする 41 'デフォルトでTrue 42 m_folder.ShowNewFolderButton = True 43 'ダイアログを表示する 44 If m_folder.ShowDialog(Me) = DialogResult.OK Then 45 txt1.Text = "" 46 ListBox1.Items.Clear() 47 For Each foundFile As String In My.Computer.FileSystem.GetFiles(m_folder.SelectedPath, FileIO.SearchOption.SearchAllSubDirectories, "*.*") 48 Dim folderPath As String = IO.Path.GetDirectoryName(foundFile) 49 txt1.Text = folderPath 50 Dim fileName As String = IO.Path.GetFileName(foundFile) 51 ListBox1.Items.Add(fileName) 52 Next 53 End If 54 Catch ex As System.UnauthorizedAccessException 55 MessageBox.Show("有効なフォルダではありません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) 56 txt1.Text = "" 57 txt1.Focus() 58 End Try 59 End Sub 60#End Region 61#Region "Background" 62 Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 63 Dim str As String 64 str = txt3.Text + txt6.Text 65 Try 66 If txt1.Text = "" And txt2.Text = "" Then 67 MessageBox.Show("アップロード対象のファイルが1件もありません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) 68 Exit Sub 69 End If 70 71 For Each foundFile As String In My.Computer.FileSystem.GetFiles(m_folder.SelectedPath, FileIO.SearchOption.SearchAllSubDirectories, "*.*") 72 System.Threading.Thread.Sleep(1000) 73 My.Computer.Network.UploadFile(foundFile, str) 74 Dim fileName As String = IO.Path.GetFileName(foundFile) 75 m_strfile = fileName 76 'ListBox3.Items.Add(m_strfile) 77 BackgroundWorker1.ReportProgress(s, m_strfile) 78 Next 79 Catch ex As System.Net.WebException 80 MessageBox.Show("有効なフォルダではありません。(フォルダが大きすぎます。)", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) 81 Catch ex As System.InvalidOperationException 82 MessageBox.Show("指定のサーバーへアクセスできません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) 83 End Try 84 End Sub 85 86 Private Sub BackgroundWorker1_ProgressChanged(sender As System.Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged 87 88 ListBox3.Items.Add(m_strfile) 89 90 End Sub 91 Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted 92 m_strBtnchange = "no" 93 btn1.Text = "アップロード開始" 94 End Sub 95 Private Sub txt1_Leave(sender As Object, e As EventArgs) Handles txt1.Leave 96 Try 97 m_folder.SelectedPath = txt1.Text 98 For Each foundFile As String In My.Computer.FileSystem.GetFiles(m_folder.SelectedPath, FileIO.SearchOption.SearchAllSubDirectories, "*.*") 99 Dim folderPath As String = IO.Path.GetDirectoryName(foundFile) 100 txt2.Text = folderPath 101 Dim fileName As String = IO.Path.GetFileName(foundFile) 102 ListBox2.Items.Add(fileName) 103 Next 104 Catch ex As System.IO.DirectoryNotFoundException 105 MessageBox.Show("有効なフォルダではありません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) 106 txt1.Text = "" 107 txt1.Focus() 108 Catch ex As System.ArgumentException 109 End Try 110 End Sub 111 112#End Region 113End Class 114 115コード

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/06/04 00:59

何を作っているか(WinForms? WPF? ASP.NET Web アプリ? その他?)と開発環境(OS, Visual Studio のバージョン、.NET Framework なのか Core なのかとそのバージョン)を書いてください。 今時 BackgroundWorker などを使っているのには何かそうせざるを得ない理由があるのですか(.NET 4.0 以前とか)? .NET 4.5 以降であれば async / await を使ってはいかがですか? キャンセル処理の実装も容易にできると思います。 非同期タスクのキャンセル http://surferonwww.info/BlogEngine/post/2020/09/27/cancellation-of-async-task.aspx
sakaka

2021/06/04 01:10

返信ありがとうございます。windows, Visual Studio 2017、.NET Framework です!! BackgroundWorkerは参考書に載っていたので、使ってみました。async / awaitを一度試してみます!
退会済みユーザー

退会済みユーザー

2021/06/04 01:30

非同期メソッド実装の変遷については以下の @IT の記事にまとめられていますので一読されてはいかがでしょう。 第1回 .NET開発における非同期処理の基礎と歴史 https://www.atmarkit.co.jp/fdotnet/chushin/masterasync_01/masterasync_01_02.html BackgroundWorker はその記事の図の「Event-based」に出てきます。(過去の遺物かも)
dodox86

2021/06/04 01:35

@質問者 sakanaさん 作っているアプリの形態(Windows Forms, WPF...)やバージョン情報は質問内容に付随する大切な情報ですので、本コメント欄にではなく、質問文中に追記、修正のかたちで加筆してください。
sakaka

2021/06/04 06:20

かしこまりました。ありがとうございます!!
退会済みユーザー

退会済みユーザー

2021/06/04 07:08

> VB background処理について windows, Visual Studio 2017、.NET Framework 何を作っているかと開発環境の追加情報はタイトルではなく本文を編集して追記してください。 それから、windows では Winforms なのか WPF なのか ASP.NET なのかその他なのかが分かりません。.NET Framework のバージョンも書いてください。 あと、BackgroundWorker を使うことでこのまま進めたいのか、async / await を使うことに方針変更するのか、どうするのでしょう?
退会済みユーザー

退会済みユーザー

2021/06/04 07:12 編集

基本的には質問のテンプレートがあるので、それに沿って記述した方がよいでしょう。 (質問作成するときに、最初に質問のテンプレート書いてある筈なんだけどな…)
退会済みユーザー

退会済みユーザー

2021/06/07 05:12

> VB background処理について windows, Visual Studio 2017、.NET Framework 何を作っているかと開発環境の追加情報はタイトルではなく本文を編集して追記してください。 それから、windows では Winforms なのか WPF なのか ASP.NET なのかその他なのかが分かりません。.NET Framework のバージョンも書いてください。 上記を今からでも遅くはないので必ずやってください。Teratail のスレッドは質問者さん専用の Q&A の場ではなくて、 https://teratail.com/help/question-tips に書いてあるように「質問と回答を通してお互いに知識や情報を交換・共有する場所」とのことです。その意味で質問の体裁を整えることは質問者さんの務めです。
guest

回答1

0

ベストアンサー

とりあえずBackgroundWorkerで進められているようなので、それベースの回答をします。

BackGroundWorker.CancelAsyncを呼び出すと、BackGroundWorker.CancellationPendingがTrueに設定されるので、それを判定してDoWorkを終了します。その際に、DoWorkEventArgs.Cancel=Trueに設定すると、RunWorkerCompletedイベント内でキャンセルされたかどうかを判定する事が出来ます。
再開をする場合は、それに必要な情報をメンバ変数に保持しておき、DoWork内でメンバ変数の値を使用して処理を継続すれば良いでしょう。

vbnet

1Imports System.ComponentModel 2 3Public Class Form1 4 5 '進行状況 6 Private _Percent As Integer = 0 7 8 Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 9 Do While _Percent < 100 10 11 'キャンセル要求が来ていたら中断 12 If BackgroundWorker1.CancellationPending Then 13 e.Cancel = True 14 Exit Do 15 End If 16 17 '一秒毎に進行状況10%加算 18 _Percent += 10 19 Threading.Thread.Sleep(1000) 20 21 '進行表示 22 BackgroundWorker1.ReportProgress(_Percent) 23 Loop 24 End Sub 25 26 Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged 27 LabelProgress.Text = $"{e.ProgressPercentage} %" 28 ProgressBar1.Value = e.ProgressPercentage 29 End Sub 30 31 Private Sub ButtonStart_Click(sender As Object, e As EventArgs) Handles ButtonStart.Click 32 BackgroundWorker1.WorkerReportsProgress = True '進行状況通知有効 33 BackgroundWorker1.WorkerSupportsCancellation = True 'キャンセル有効化 34 35 'BackgroundWorker実行 36 BackgroundWorker1.RunWorkerAsync() 37 End Sub 38 39 Private Sub ButtonCancel_Click(sender As Object, e As EventArgs) Handles ButtonCancel.Click 40 'キャンセル要求をする(BackgroundWorker1.CancellationPending=Trueに設定される) 41 BackgroundWorker1.CancelAsync() 42 End Sub 43 44 Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted 45 If e.Cancelled Then 46 LabelProgress.Text &= " 中断しました" 47 Else 48 LabelProgress.Text &= " 完了しました" 49 End If 50 End Sub 51 52End Class

追記修正依頼でSurferOnWwwさんが紹介されているasync/awaitは新しい方法で、完全に新規でやるのであればそちらの方を推奨しますが、書き方もガラっと変わってくるので、関連する記事を探して読んで学習してみてください。一応BackgroundWorkerも使えなくなった訳ではないので、機能を満たせればいいのであれば問題ありません。

投稿2021/06/04 07:50

編集2021/06/04 08:29
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問