Visual StudioでWPFアプリケーションを作成しています。大きなファイルをダウンロードしてコードで抽出する必要があります。誰かが私がバックグラウンドワーカーを使うことを勧めましたが、現在進行状況バーの値を上げようとするとうまくいきません...だれでも助けてくれますか?UIが応答しない+バックグラウンドワーカーを使用中にプログレスバーが機能しないC#
public void InstallVersion(string version)
{
string location = File.ReadAllText(@"C:\Users\" + Environment.UserName + @"\AppData\Roaming\MidnightFallsLauncher\data\locator.txt");
location = location + @"\Versions\" + version;
if (File.Exists(location + ".zip"))
File.Delete(location + ".zip");
if (Directory.Exists(location))
{
DirectoryInfo di = new DirectoryInfo(location);
foreach (FileInfo file in di.GetFiles())
{
file.Delete();
}
foreach (DirectoryInfo dir in di.GetDirectories())
{
dir.Delete(true);
}
}
if (!myWorker.IsBusy)
{
myWorker.RunWorkerAsync();
}
}
そして、ここでは私の労働者が実行している間、UIがフリーズ...私はそれが起こることを意図していないかなり確信している、また、私のワーカーコード
public MainWindow()
{
InitializeComponent();
myWorker.DoWork += new DoWorkEventHandler(myWorker_DoWork);
myWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(myWorker_RunWorkerCompleted);
myWorker.ProgressChanged += new ProgressChangedEventHandler(myWorker_ProgressChanged);
myWorker.WorkerReportsProgress = true;
myWorker.WorkerSupportsCancellation = true;
}
protected void myWorker_DoWork(object sender, DoWorkEventArgs e)
{
string location = File.ReadAllText(@"C:\Users\" + Environment.UserName + @"\AppData\Roaming\MidnightFallsLauncher\data\locator.txt");
location = location + @"\Versions\" + Version;
WebClient Client = new WebClient();
string url = "";
string content = "";
string downloadlink = "";
List<string> availibleVersions = new List<string>();
List<string> versionDownload = new List<string>();
url = "https://midnightfalls.glitch.me/versions.html";
content = Client.DownloadString(url);
foreach (string line in content.Split(new string[] { "<br>", "<br />" }, StringSplitOptions.None))
{
if (line.Contains("0"))
{
availibleVersions.Add(line);
}
}
url = "https://midnightfalls.glitch.me/versionslink.html";
content = Client.DownloadString(url);
foreach (string line in content.Split(new string[] { "<br>", "<br />" }, StringSplitOptions.None))
{
if (line.Contains("https"))
{
versionDownload.Add(line);
}
}
for (var i = 0; i < availibleVersions.Count; i++)
{
if (availibleVersions[i] == Version)
{
downloadlink = versionDownload[i];
}
}
Client.DownloadFile(downloadlink, location + ".zip");
ZipFile.ExtractToDirectory(location + ".zip", location);
File.Delete(location + ".zip");
RunGame(Version);
}
protected void myWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
}
protected void myWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.Dispatcher.Invoke(() =>
{
progress.Value += 10;
});
}
です。
EDIT: UIは今、私はあなたが右ここにブロックしているかなり確信している...
ありがとう!それはUIを修正しますが、プログレスバーはまだ更新されません... – WhoKnows
あなたは大歓迎です。問題のコードは更新されたコードですか?または進捗状況の更新をバックグラウンドワーカーに移しましたか? また、私は他の答えにしたコメントを見たことがありますか? – kkirk
私はコードを今すぐ更新しました – WhoKnows