[英]Accessing UI Objects During Filestream c#
我的代碼如下:
private void btnCovert_Click(object sender, EventArgs e)
{
//get file
string blfrpath = txtPath.Text;
byte[] b = new byte[108];
//ASCIIEncoding ascii = new ASCIIEncoding();
string blfObjstr;
long filesize;
long numObjs;
int i;
using (FileStream fs = File.Open(blfrpath, FileMode.Open))
{
filesize = fs.Length;
numObjs = filesize / 56;
i = 0;
while (fs.Read(b, 0, b.Length) > 0)
{
blfObjstr = Encoding.ASCII.GetString(b);
lstData.Items.Add(blfObjstr);
prbConvert.Value = (i/(int)numObjs)*100;
i++;
}
}
}
問題是單擊按鈕而不是在每次迭代時都更新列表框,或者增加進度表的進度條似乎凍結了,並且似乎在運行所需要的整個30秒時間內崩潰了。 我該如何預防呢?
我嘗試使用任務,將其添加到最后(並使click事件異步)
Task<int> task = updateUI(blfObjstr, i, (int)numObjs);
int result = await task;
}
}
private async Task<int> updateUI(string listStr, int probNum,int prbDenom)
{
prbConvert.Value = (probNum/prbDenom) * 100;
lstData.Items.Add(listStr);
return 1;
}
我嘗試添加一個既簡單又簡單的后台工作人員:將更新內容添加到后台工作人員中。 但是即使在運行時我將i作為參數,我在第二次迭代中也只會得到“該后台工作人員已經很忙”。
我嘗試將整個事情放在后台編輯器中,然后在報表進度調用中進行更新,但這也不起作用。
謝謝
您正在使用主UI線程進行長時間計算。 UI線程負責更新UI,因此,如果長時間計算阻止它,則您的應用程序將凍結。 設置諸如prbConvert.Value之類的屬性不會直接更新UI,它只會為UI線程生成消息以在以后更新UI。
您可以使用以下任務在其他線程上讀取文件:
private async void btnCovert_Click(object sender, EventArgs e)
{
//get file
string blfrpath = txtPath.Text;
byte[] b = new byte[108];
//ASCIIEncoding ascii = new ASCIIEncoding();
string blfObjstr;
long filesize;
long numObjs;
int i;
using (FileStream fs = File.Open(blfrpath, FileMode.Open))
{
filesize = fs.Length;
numObjs = filesize / 56;
i = 0;
while (await Task<int>.Factory.FromAsync(fs.BeginRead, fs.EndRead, b, 0, b.Length, null) > 0)
{
blfObjstr = Encoding.ASCII.GetString(b);
lstData.Items.Add(blfObjstr);
prbConvert.Value = (i/(int)numObjs)*100;
i++;
}
}
}
有更多方法可以解決此問題,這只是其中一種,其他可以是BackgroundWorker類或使用自己的Thread並執行Invoke來更新UI。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.