Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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,关于如何使用长时间运行的操作生成winForm,我可以从哪些资源中获得一些提示 我的设想是这样的。我有一个WinForm,它调用API并将数据存储到datagridview中,datagridview具有多列和大约10000多行 我正在运行多个操作,例如在不同的列中计算值的不同实例,并运行数学运算符来获取值。该应用程序运行在大约2000行上,但当我达到4000行时,会出现COM错误或其他问题,使其无法执行 我不在乎是否可以访问UI,我只需要应用程序运行 关于如何使用长时间运行的操作生成winFo

关于如何使用长时间运行的操作生成winForm,我可以从哪些资源中获得一些提示

我的设想是这样的。我有一个WinForm,它调用API并将数据存储到datagridview中,datagridview具有多列和大约10000多行

我正在运行多个操作,例如在不同的列中计算值的不同实例,并运行数学运算符来获取值。该应用程序运行在大约2000行上,但当我达到4000行时,会出现COM错误或其他问题,使其无法执行

我不在乎是否可以访问UI,我只需要应用程序运行

关于如何使用长时间运行的操作生成winForm,我可以从哪些资源中获得一些提示

当然,这方面有很多资源。你很可能正在寻找新的目标。上面有一个很棒的“代码项目”

BackgroundWorker
支持取消,甚至支持进度报告。此外,您还需要实现其他几个关键事件

理想情况下,当表单使用该对象时,您将清理并处置该对象——此外,请确保在清理过程中取消事件处理程序。还有一个

关于如何使用长时间运行的操作生成winForm,我可以从哪些资源中获得一些提示

当然,这方面有很多资源。你很可能正在寻找新的目标。上面有一个很棒的“代码项目”

BackgroundWorker
支持取消,甚至支持进度报告。此外,您还需要实现其他几个关键事件


理想情况下,当表单使用该对象时,您将清理并处置该对象——此外,请确保在清理过程中取消事件处理程序。这是另一个。

请提供一些源代码,以便可能的答案可以为您举例说明。您需要在后台使用线程或其他进程运行操作-最常见的方法是使用线程,但有多种方法可以做到这一点。你可能想从这样的文章或类似文章中的任何一篇开始。请详细描述COM错误(异常信息)。请提供一些源代码,以便可能的答案可以为您举例说明。您需要在后台使用线程或其他进程运行操作-最常见的方法是使用线程,但有多种方法。你可能想从这样的文章或类似文章中的任何一篇开始。请详细描述COM错误(异常信息)。我在方法中直接使用了很多UI对象。这是坏习惯吗?例如,如果我有一个listbox1,它有一个在运行操作之前设置的值,我将使用listbox1.text在方法中调用它。我知道有办法调用UI对象,这样它就不会给我一个错误,但是将所有对象值存储到一个变量中是否更好?您只需确保在与UI交互时将操作封送回UI线程,这可以通过
调用/BeginInvoke
完成。几年前我写了一个扩展方法。当msdn声明使用tpl是一条可行之路时,为什么建议使用backgroundworker?看见另外,请参阅Stephen Cleary关于如何用async/await替换backgroundworker的这篇文章。不需要调用/BeginInvoke等。Stephen Cleary提供了两者的比较,而不是全部替换。我在构造函数中开始了异步工作。TPL在这里仍然是一个非常有效的选项,我在这里发布了这个选项,因为我觉得OP提供的信息数量有限,我在这个方法中直接使用了很多UI对象。这是坏习惯吗?例如,如果我有一个listbox1,它有一个在运行操作之前设置的值,我将使用listbox1.text在方法中调用它。我知道有办法调用UI对象,这样它就不会给我一个错误,但是将所有对象值存储到一个变量中是否更好?您只需确保在与UI交互时将操作封送回UI线程,这可以通过
调用/BeginInvoke
完成。几年前我写了一个扩展方法。当msdn声明使用tpl是一条可行之路时,为什么建议使用backgroundworker?看见另外,请参阅Stephen Cleary关于如何用async/await替换backgroundworker的这篇文章。不需要调用/BeginInvoke等。Stephen Cleary提供了两者的比较,而不是全部替换。我在构造函数中开始了异步工作。第三方物流仍然是一个非常有效的选择在这里,我张贴了基于什么,我觉得是正确的有限数量的信息从OP。
public partial class Form1 : Form
{
    BackgroundWorker backgroundWorker;

    public Form1()
    {
        InitializeComponent();

        backgroundWorker = new BackgroundWorker();
        backgroundWorker.DoWork += OnDoWork;
    }

    void OnDoWork(object sender, DoWorkEventArgs e)
    {
        // Long running code here.
    }
}