C# 等待/异步块用户界面

C# 等待/异步块用户界面,c#,C#,我有一个非常简单的应用程序,它实际上只是一个大得多的应用程序的模块,我必须在其中处理文本文档的所有段落。我已经编写了一个异步方法来允许进度报告和不冻结用户界面,但这些都不起作用。进度条只在末尾填充,UI在执行过程中被阻塞 我尝试了async/Wait和BackgroundWorker方法,但都没有成功 public partial class MainWindow : Window { public MainWindow() { InitializeCompone

我有一个非常简单的应用程序,它实际上只是一个大得多的应用程序的模块,我必须在其中处理文本文档的所有段落。我已经编写了一个异步方法来允许进度报告和不冻结用户界面,但这些都不起作用。进度条只在末尾填充,UI在执行过程中被阻塞

我尝试了async/Wait和BackgroundWorker方法,但都没有成功

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    public async Task<string> ReadTextFile()
    {
        string result = null;

        using (StreamReader reader = File.OpenText(@"C:\Users\Junior\Desktop\asynctest.txt"))
        {
            result = await reader.ReadToEndAsync();
        }

        return result;
    }

    public string[] CreateParagraphs(string text)
    {
        string[] result;

        result = text.Split(new string[] { "\n", "\r", "\r\n" },  StringSplitOptions.None);

        return result;
    }

    public List<string> ReplaceGestures(string[] paragraphs, IProgress<int> progress)
    {
        List<string> result = new List<string>();

        for(int i=0; i < paragraphs.Length; i++)
        {
            paragraphs[i] = paragraphs[i].Replace("+", "(*)");

            if (progress != null && (i % 10 == 0))
                progress.Report(i);
        }

        return result;
    }

    private async void Button_Click_1(object sender, RoutedEventArgs e)
    {
        Info.Text = "Reading file...";

        string text = await ReadTextFile();

        Info.Text = "Creating paragraphs...";

        string[] paragraphs = await Task.Run(() => CreateParagraphs(text));

        Info.Text = "Replacing gestures....";

        Bar.Maximum = paragraphs.Length;

        var progress = new Progress<int>(percent =>
        {
            Bar.Value = percent; 
        });

        List<string> paragraphsWithGestures = await Task.Run(() => ReplaceGestures(paragraphs, progress));

        Info.Text = "Done.";
    }
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
公共异步任务ReadTextFile()
{
字符串结果=null;
使用(StreamReader=File.OpenText(@“C:\Users\Junior\Desktop\asynctest.txt”))
{
结果=等待读卡器。ReadToEndAsync();
}
返回结果;
}
公共字符串[]创建段落(字符串文本)
{
字符串[]结果;
结果=text.Split(新字符串[]{“\n”,“\r”,“\r\n”},StringSplitOptions.None);
返回结果;
}
公共列表替换手势(字符串[]段落,IProgress进度)
{
列表结果=新列表();
对于(int i=0;i<段落长度;i++)
{
第[i]段=第[i]段。替换“+”、“(*)”;
如果(进度!=null&(i%10==0))
进度报告(一);
}
返回结果;
}
专用异步无效按钮\u单击\u 1(对象发送方,路由目标)
{
Info.Text=“正在读取文件…”;
string text=wait ReadTextFile();
Info.Text=“创建段落…”;
string[]段落=等待任务。运行(()=>create段落(文本));
Info.Text=“替换手势…”;
最大横杆=段落长度;
变量进度=新进度(百分比=>
{
Bar.值=百分比;
});
列出段落swithbiges=wait Task.Run(()=>replaceSpiges(段落,进度));
Info.Text=“完成。”;
}
}

我希望这段代码以10次迭代的间隔更新进度条。

结果
从未在
replacespirates
中填充。是的,我忽略了这段代码。但不管怎样,这对手头的问题并不重要。你的代码。您确定问题不在您忽略的代码中吗?您可能发送太多进度更新,太快,锁定了UI b/c,并花费所有时间重新绘制进度条。您是否尝试过较不频繁的更新?很可能DaveM已经发现了问题。我建议按时间间隔限制更新。您可以使用。
result
从未在
replacespirates
中填充是的,我省略了该代码。但不管怎样,这对手头的问题并不重要。你的代码。您确定问题不在您忽略的代码中吗?您可能发送太多进度更新,太快,锁定了UI b/c,并花费所有时间重新绘制进度条。您是否尝试过较不频繁的更新?很可能DaveM已经发现了问题。我建议按时间间隔限制更新。你可以用它。