いつもお世話になっております。
現在ファイルアップローダーを作っている途中です。そこでは、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コード
何を作っているか(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
返信ありがとうございます。windows, Visual Studio 2017、.NET Framework です!!
BackgroundWorkerは参考書に載っていたので、使ってみました。async / awaitを一度試してみます!
非同期メソッド実装の変遷については以下の @IT の記事にまとめられていますので一読されてはいかがでしょう。
第1回 .NET開発における非同期処理の基礎と歴史
https://www.atmarkit.co.jp/fdotnet/chushin/masterasync_01/masterasync_01_02.html
BackgroundWorker はその記事の図の「Event-based」に出てきます。(過去の遺物かも)
@質問者 sakanaさん
作っているアプリの形態(Windows Forms, WPF...)やバージョン情報は質問内容に付随する大切な情報ですので、本コメント欄にではなく、質問文中に追記、修正のかたちで加筆してください。
かしこまりました。ありがとうございます!!
> VB background処理について windows, Visual Studio 2017、.NET Framework
何を作っているかと開発環境の追加情報はタイトルではなく本文を編集して追記してください。
それから、windows では Winforms なのか WPF なのか ASP.NET なのかその他なのかが分かりません。.NET Framework のバージョンも書いてください。
あと、BackgroundWorker を使うことでこのまま進めたいのか、async / await を使うことに方針変更するのか、どうするのでしょう?
基本的には質問のテンプレートがあるので、それに沿って記述した方がよいでしょう。
(質問作成するときに、最初に質問のテンプレート書いてある筈なんだけどな…)
> VB background処理について windows, Visual Studio 2017、.NET Framework
何を作っているかと開発環境の追加情報はタイトルではなく本文を編集して追記してください。
それから、windows では Winforms なのか WPF なのか ASP.NET なのかその他なのかが分かりません。.NET Framework のバージョンも書いてください。
上記を今からでも遅くはないので必ずやってください。Teratail のスレッドは質問者さん専用の Q&A の場ではなくて、 https://teratail.com/help/question-tips に書いてあるように「質問と回答を通してお互いに知識や情報を交換・共有する場所」とのことです。その意味で質問の体裁を整えることは質問者さんの務めです。
回答1件
あなたの回答
tips
プレビュー