【发布时间】:2018-06-30 00:51:12
【问题描述】:
我创建了一个应用程序来修补我的游戏服务器文件。 但是,我有 3 个我无法解决的问题:
- 下载新补丁时,它不会立即更新进度条,而是在大约 30-40 秒后刷新
- 我想要一个标签来显示他们正在下载多少兆字节,以及他们到目前为止有多少(例如:122Mb/750Mb
- 下载时,我想要一个标签来显示到目前为止已下载量的 ~%
我不确定如何添加数字 2 和 3,数字 1 的问题似乎很荒谬,因为没有任何迹象表明它应该在我的编码中 30-40 秒后刷新(至少据我所知)
我的 backgroundWorker1_DoWork:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//Defines the server's update directory
string Server = "http://localhost/dl/game-updates/";
//Defines application root
string Root = AppDomain.CurrentDomain.BaseDirectory;
//Make sure version file exists
FileStream fs = null;
if (!File.Exists("version"))
{
using (fs = File.Create("version"))
{
}
using (StreamWriter sw = new StreamWriter("version"))
{
sw.Write("1.0");
}
}
//checks client version
string lclVersion;
using (StreamReader reader = new StreamReader("version"))
{
lclVersion = reader.ReadLine();
}
decimal localVersion = decimal.Parse(lclVersion);
//server's list of updates
XDocument serverXml = XDocument.Load(@Server + "Updates.xml");
//The Update Process
foreach (XElement update in serverXml.Descendants("update"))
{
string version = update.Element("version").Value;
string file = update.Element("file").Value;
decimal serverVersion = decimal.Parse(version);
string sUrlToReadFileFrom = Server + file;
string sFilePathToWriteFileTo = Root + file;
if (serverVersion > localVersion)
{
Uri url = new Uri(sUrlToReadFileFrom);
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse();
response.Close();
Int64 iSize = response.ContentLength;
Int64 iRunningByteTotal = 0;
using (System.Net.WebClient client = new System.Net.WebClient())
{
using (System.IO.Stream streamRemote = client.OpenRead(new Uri(sUrlToReadFileFrom)))
{
using (Stream streamLocal = new FileStream(sFilePathToWriteFileTo, FileMode.Create, FileAccess.Write, FileShare.None))
{
int iByteSize = 0;
byte[] byteBuffer = new byte[iSize];
while ((iByteSize = streamRemote.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
{
streamLocal.Write(byteBuffer, 0, iByteSize);
iRunningByteTotal += iByteSize;
double dIndex = (double)(iRunningByteTotal);
double dTotal = (double)byteBuffer.Length;
double dProgressPercentage = (dIndex / dTotal);
int iProgressPercentage = (int)(dProgressPercentage * 100);
backgroundWorker1.ReportProgress(iProgressPercentage);
}
streamLocal.Close();
}
streamRemote.Close();
}
}
//unzip
using (ZipFile zip = ZipFile.Read(file))
{
foreach (ZipEntry zipFiles in zip)
{
zipFiles.Extract(Root + "\\", true);
}
}
//download new version file
WebClient webClient = new WebClient();
webClient.DownloadFile(Server + "version.txt", @Root + "version");
//Delete Zip File
deleteFile(file);
}
}
}
我的 backgroundWorker1_ProgressChanged:
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
label1.Text = "Downloading updates...";
}
还有我的 backgroundWorker1_RunWorkerCompleted:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
settings_btn.Enabled = true;
start_btn_disabled.Enabled = false;
start_btn_disabled.Visible = false;
start_btn.Visible = true;
start_btn.Enabled = true;
progressBar1.Value = 100;
label1.Text = "Client is up to date!";
}
另外,附注:我在更新 backgroundWorker2_DoWork 中的标签时也遇到了一些问题? 有什么想法吗?
【问题讨论】:
-
欢迎来到这个网站,约翰。如果您想有更好的机会得到回答,请查看:stackoverflow.com/help/how-to-ask
-
@demonplus 该帖子上的那个人正在使用 backgroundworker 插入 mysql 值。我不是。在说它是重复的之前,您应该阅读该帖子
-
@JohnK 当有人建议重复时,这可能意味着该问题中的代码对您有用 - 我认为您采取了错误的方式。您的问题部分是关于在使用
BackgroundWorker时更新标签,这与链接的问题相同。 -
哦。我的错。对不起,@demonplus。
标签: c#