私はVB.NetのファイルブラウザでMonoフレームワークのUbuntu上で動作しています。私は検索機能を実装することに決めたまで、すべてうまくいっていた。私は検索が新しいタスクで実行されるように設定して、ユーザーはフォームから取り消すことができます。これは、Windows上で正常に動作しますが、モノラルで実行した場合、私は奇妙な結果を得る:時々フォームのフリーズが(まだ周りにドラッグすることができますが、内部のすべてが応答しない)タスクのファイルを再帰的に検索するとMonoでフォームがフリーズする
- 時々、いくつかの検索結果が出てきますフォームがフリーズする
- フォームがフリーズしているので、キャンセルボタンをクリックすることができず、強制終了する必要があります。
- エラーメッセージや例外はありません。
- 時にはフォームアーティファクト理論的には、検索コードが別のタスクに
を実行しているにもかかわらず、画面上でドラッグ場合、私は、全体を通して「Application.DoEventsを()」を挿入しようとしたが、それは助けにはなりませんでした。私はタスクなしでUIスレッド上でコードを実行しようとしましたが、明らかにすべてがフリーズするだけです。ここで
はコードです:検索()メソッドは、表示され、キャンセルボタンを呼ばれたときに、テキストボックスを介して呼び出され、クリックされた場合は、()
Dim tokenSource2 As New CancellationTokenSource()
Dim ct As CancellationToken = tokenSource2.Token
Private Sub Search(ByVal txt As String, ByVal dir As String)
CancelSearch()
tokenSource2 = New CancellationTokenSource()
ct = tokenSource2.Token
pnl_cancelsearch.Show()
Dim t As Task = Task.Factory.StartNew(Sub()
If ct.IsCancellationRequested Then
Exit Sub
End If
ListView1.Clear()
Dim iscasesensitive As Boolean = ConfigManager.SearchIsCaseSensitive
If Not searchhistory.Contains(txt) Then
searchhistory.Add(txt)
combo_search.Items.Add(txt)
End If
If ct.IsCancellationRequested Then
Exit Sub
End If
If dir = "" Then
For Each item As String In Directory.GetLogicalDrives
If ct.IsCancellationRequested Then
Exit Sub
End If
SearchRec(txt, item, iscasesensitive)
Next
Else
SearchRec(txt, dir)
End If
pnl_cancelsearch.Hide()
End Sub)
End Sub
Private Sub SearchRec(ByVal txt As String, ByVal rootdir As String, Optional ByVal casesensitive As Boolean = True)
For Each item As String In Directory.GetFiles(rootdir)
If ct.IsCancellationRequested Then
Exit Sub
End If
If casesensitive Then
If item.Contains(txt) Then
AddItem(item)
End If
Else
If item.ToLower.Contains(txt.ToLower) Then
AddItem(item)
End If
End If
Next
For Each item As String In Directory.GetDirectories(rootdir)
If ct.IsCancellationRequested Then
Exit Sub
End If
SearchRec(txt, item)
Next
End Sub
tokenSource2.Cancelを呼び出します
どうすれば修正できますか?私は間違って何をしていますか?それは、Windowsでは完全に正常に動作しますが、Monoでは動作しません。
あとで「EndInvoke」を呼び出すことを忘れないでください。 –