これは私のXAMLパーツコードです:
<DockPanel Margin="1 5 1 0" Height="25">
<Button DockPanel.Dock="Right" Width="70" Margin="6 0 0 0" Content="Install" Click="Install" />
<Button DockPanel.Dock="Right" Width="70" Margin="6 0 0 0" Content="Uninstall"/>
<ProgressBar Name="progressBar"/>
</DockPanel>
そしてこれはインストール方法です:
private void Install(object sender, RoutedEventArgs e)
{
progressBar.Value = 5;
installer.InstallProgram1();
progressBar.Value = 25;
installer.InstallProgram2();
progressBar.Value = 50;
installer.InstallProgram3();
progressBar.Value = 75;
installer.InstallProgram4();
progressBar.Value = 100;
}
インストールボタンをクリックすると、Installメソッドが実行されますが、正しく実行されません。
-最初の行は実行されません: 'progressBar.Value = 5'。
--2行目はうまく機能します。
-そして何も機能しなかった後。
メソッドを「MessageBox.Show( "HelloWorld")」に置き換えようとしましたが、機能し、プログレスバーの値が変わります。
しかし、なぜそれが私の方法では機能しないのですか?
'installer.InstallProgram2()'が機能しない/終了しないのはなぜですか?
私の2つの方法は、Installer.csファイル内にあります。
public void InstallProgram1()
{
// Download the lavfilters executable.
var url = "http://www.videohelp.com/software/LAV-Filters";
var selector = "a.linktool:nth-child(12)";
var filename = downloader.DownloadFromVideoHelp(url, selector);
// TODO: Installation
}
public void InstallProgram2()
{
// Download the madVR archive
var url = "http://www.videohelp.com/software/madVR";
var selector = ".linktool";
var filename = downloader.DownloadFromVideoHelp(url, selector);
// TODO: Installation
}
なければ良い、最小限の、完全なコード例、確かにあなたの問題を解決する最善の方法を知ることは不可能です。しかし、助けるためにいくつかのアドバイスを与えることができます。
まず、次のように書きます。
最初の行は実行されません: 'progressBar.Value = 5'。
それは単に誤りです。デバッガーはあなたに多くを教えてくれます。メソッドの最初のステートメントが残りのステートメントの実行中にスキップされる可能性はありません。
メソッド内の残りのステートメントについては、機能する場合と機能しない場合があります。繰り返しになりますが、完全なコード例がないため、StackOverflowの誰もがそれについてコメントすることさえできません。
私が言えることは、投稿したコードは、割り当てられたステートメントが実行されていないように見えるprogressBar.Value
ことです。これは、UIスレッドでこれらのステートメントを実行しているため、そのスレッドが画面全体の更新を実行できないためです。メソッドが完了しました。
されている可能性があり、すべてのあなたのコードに問題があること。もしそうなら、このように見えるようにメソッドを変更すると役立つはずです:
private async void Install(object sender, RoutedEventArgs e)
{
progressBar.Value = 5;
await Task.Run(() => installer.InstallProgram1());
progressBar.Value = 25;
await Task.Run(() => installer.InstallProgram2());
progressBar.Value = 50;
await Task.Run(() => installer.InstallProgram3());
progressBar.Value = 75;
await Task.Run(() => installer.InstallProgram4());
progressBar.Value = 100;
}
上記の機能は、さまざまな「インストーラー」メソッドを別のスレッドで実行することです。新しい(.NET 4.5以降)async
/await
機能を使用して、UIスレッドとタスク間の対話を簡素化します。メソッド自体のすべてのコードは引き続きUIスレッドで実行されますが、「インストーラー」メソッドを呼び出す(現在の)匿名メソッドはスレッドプールを使用して実行されます。
C#はInstall()
各await
ステートメントのメソッドから戻り、UIスレッドが正常に動作し続けることを可能にします(たとえば、の新しい値を反映するようにUIを更新しますProgressBar
)。各タスクが完了すると、制御はそのタスクのステートメントのInstall()
後にメソッドに戻りawait
ます。これは、メソッドが通常のリターンポイント(return
ステートメント、またはここではメソッド本体の終わりなど)に到達するまで繰り返されます。
異なるスレッドでコードを実行する際の通常の落とし穴に注意してください。投稿したコード例には、「インストーラー」メソッドを別のスレッドで実行できないことを示唆するものは何もありませんが、コード例は完全にはほど遠いため、それほど多くのことを言っているわけではありません。対処すべき並行性の問題があると思われる場合は、問題の例を、それらの問題を十分に説明する適切なコード例(上記のリンクを参照)に減らし、それらの問題について具体的に尋ねる新しい質問を投稿してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加