簡體   English   中英

在文件流c#中訪問UI對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM