Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 长时间运行任务的视觉反馈_C#_Winforms - Fatal编程技术网

C# 长时间运行任务的视觉反馈

C# 长时间运行任务的视觉反馈,c#,winforms,C#,Winforms,我对每个循环都进行了很长时间的运行,我想知道是否有一种惯用的方法来添加一些可视化的用户反馈,这样用户就不会认为应用程序崩溃了 private void btnRunLongRunningTask_Click(object sender, EventArgs e) { foreach(string path in Directory.EnumerateFiles(@"path"), "*.ext", SearchOption.AllDirectories)) { v

我对每个循环都进行了很长时间的运行,我想知道是否有一种惯用的方法来添加一些可视化的用户反馈,这样用户就不会认为应用程序崩溃了

private void btnRunLongRunningTask_Click(object sender, EventArgs e)
{
    foreach(string path in Directory.EnumerateFiles(@"path"), "*.ext", SearchOption.AllDirectories))
    {
        var result = LongRunning.Task(path);
        string resultPath = Manipulate(path);
        // write result to resultPath
    }
}
这可能会有所帮助:任务本身并不需要很长时间,但可能会有很多


有没有关于我如何做到这一点的建议?由于给了我一个目录作为参数,我想我应该查找任务将执行多少次,然后相应地更新progressbar,在后台工作程序中运行任务和更新代码,注意交叉线程访问问题。

您可以将工作移到BackgroundWorker并使用ReportProgress方法

for (i = 0; i < count; i++)
{
    // do work
    worker.ReportProgress((100 * i) / count);
}

private void MyWorker_ProgressChanged(object sender,
    ProgressChangedEventArgs e)
{
    taskProgressBar.Value = Math.Min(e.ProgressPercentage, 100);
}
for(i=0;i
您可以将工作移动到BackgroundWorker并使用ReportProgress方法

for (i = 0; i < count; i++)
{
    // do work
    worker.ReportProgress((100 * i) / count);
}

private void MyWorker_ProgressChanged(object sender,
    ProgressChangedEventArgs e)
{
    taskProgressBar.Value = Math.Min(e.ProgressPercentage, 100);
}
for(i=0;i
进度条?在每次迭代之后,您都会逐步进入进度栏。看看使用后台工作程序-这似乎是可以使用的,特别是(只要LongRunning.Task是线程安全的),这可能会更快。我以前从未在WinForms中使用过它,所以我不知道您是否可以直接调用它,或者您是否可以在BackgroundWorker中调用Parallel.Foreach(或者,更简单一些)。只是查看了TPL,我想知道使用Parallel.Foreach提供视觉反馈是否仍然可行。我知道这将减少完成这些任务所需的时间,但这是否意味着我必须放弃视觉反馈?这些任务仍将运行一段时间。@lowerkey这里有几个完全独立的任务,首先需要确保没有阻塞UI线程,这样应用程序就不会冻结。接下来,您需要根据后台任务的进度更新UI。最后,您可能希望实际使用多个线程并行执行代码,而不仅仅是单个后台线程。你可以做前两个,最后一个,或者全部;他们是独立的。至于链接,在这种情况下,进度并不完全正确,但这是一个很好的解决方案,只需很少的努力。进度条?在每次迭代之后,您都会逐步进入进度栏。看看使用后台工作程序-这似乎是可以使用的,特别是(只要LongRunning.Task是线程安全的),这可能会更快。我以前从未在WinForms中使用过它,所以我不知道您是否可以直接调用它,或者您是否可以在BackgroundWorker中调用Parallel.Foreach(或者,更简单一些)。只是查看了TPL,我想知道使用Parallel.Foreach提供视觉反馈是否仍然可行。我知道这将减少完成这些任务所需的时间,但这是否意味着我必须放弃视觉反馈?这些任务仍将运行一段时间。@lowerkey这里有几个完全独立的任务,首先需要确保没有阻塞UI线程,这样应用程序就不会冻结。接下来,您需要根据后台任务的进度更新UI。最后,您可能希望实际使用多个线程并行执行代码,而不仅仅是单个后台线程。你可以做前两个,最后一个,或者全部;他们是独立的。至于链接,在这种情况下进展并不完全正确,但这是一个很好的解决方案,只需很少的努力。+1
BackgroundWorker
对于线程新手可能更容易实现。+1
BackgroundWorker
对于线程新手可能更容易实现。