Task.Run по-прежнему замораживает интерфейс - PullRequest
0 голосов
/ 27 сентября 2019

Итак, я пытаюсь преобразовать массив больших байтов в его кодированный вариант base64.Но независимо от того, что я пытаюсь сделать, мне кажется, что мой интерфейс зависает каждый раз, когда он запускается.

Это то, что я получил в настоящее время:

private async void TxtOutput_DragDrop(object sender, DragEventArgs e)
    {
        string outputText = String.Empty;


        if (e.Data.GetDataPresent(DataFormats.FileDrop))
        {

            string[] path = (string[])e.Data.GetData(DataFormats.FileDrop);
            byte[] fileBytes = File.ReadAllBytes(path[0]);
            txtOutput.Text = await Task.Run(() => {return Convert.ToBase64String(fileBytes);});
            _ = fileBytes;
            _ = path;

        }
    }

Итак, линия, которая замораживает все:

txtOutput.Text = await Task.Run(() => {return Convert.ToBase64String(fileBytes);});

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Правильно, получается, что моей проблемой было использование текстового поля для записи строки вместо richtextbox.Это исправило мою проблему.Спасибо за ваши ответы.

0 голосов
/ 27 сентября 2019
 File.ReadAllBytes(path[0])

Может быть бутылочным горлышком, вы можете использовать асинхронную операцию для чтения файлов. Вот пример, как читать файл асинхронно

        public async Task ProcessReadAsync()  
    {  
        string filePath = @"temp2.txt";  

        if (File.Exists(filePath) == false)  
        {  
            Debug.WriteLine("file not found: " + filePath);  
        }  
        else  
        {  
            try  
            {  
                string text = await ReadTextAsync(filePath);  
                Debug.WriteLine(text);  
            }  
            catch (Exception ex)  
            {  
                Debug.WriteLine(ex.Message);  
            }  
        }  
    }  

    private async Task<string> ReadTextAsync(string filePath)  
    {  
        using (FileStream sourceStream = new FileStream(filePath,  
            FileMode.Open, FileAccess.Read, FileShare.Read,  
            bufferSize: 4096, useAsync: true))  
        {  
            StringBuilder sb = new StringBuilder();  

            byte[] buffer = new byte[0x1000];  
            int numRead;  
            while ((numRead = await sourceStream.ReadAsync(buffer, 0, buffer.Length)) != 0)  
            {  
                string text = Encoding.Unicode.GetString(buffer, 0, numRead);  
                sb.Append(text);  
            }  

            return sb.ToString();  
        }  
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...