c# - 从 gui 异步执行方法的最佳方法

标签 c# multithreading

我正在构建一个桌面应用程序,每隔 x 秒间隔从数据库检索数据,以便将该数据显示到 winform,我不想阻止我的 gui,我不在乎检索数据的方法是否需要一段时间小于检查间隔,我希望该方法与 GUI 异步,最好的方法是什么?为什么?谢谢我是线程新手!

后台 worker ? 线程. sleep ? 手动重置事件?

最佳答案

因此,您首先说您希望每 X 秒执行一项任务。这告诉我们我们需要一个计时器。不过有很多可供选择。 System.Timer 应该可以很好地满足我们的目的,但如果您想使用 System.Windows.Forms.Timer 也可以。您需要在打开表单时启动计时器,将时间间隔配置为您想要的值,并指定一个处理程序在计时器触发时运行。

接下来,当计时器触发时,您需要执行数据库调用并更新 UI。执行长时间运行的操作,然后使用结果更新 UI 是 BackgroundWorker 类的量身定制。设置 DoWork 方法来执行数据库调用,并让 WorkerCompleted 事件根据结果更新 UI。 (已完成的事件将自动在 UI 线程中运行;您无需手动编码到该线程。)

如果您有足够新的 C# 版本,您也可以使用任务来执行这些相同的操作。您可以使用 Task.Factory.StartNew 进行数据库调用,使其在后台线程中运行,然后您可以在 Task 上调用 ContinueWith > 它返回并使用允许您指定同步上下文的重载。这是一个简单的例子:

private void handler(object sender, EventArgs e)
{
    Task.Factory.StartNew(() => getInfoFromDB())
        .ContinueWith(task => label1.Text = task.Result,
        CancellationToken.None, TaskContinuationOptions.None,
        TaskScheduler.FromCurrentSynchronizationContext());
}

private string getInfoFromDB()
{
    Thread.Sleep(2000);//simulate long IO operation
    return "Hello world!";
}

请注意,要使这个基于Task的示例正常工作,您需要使用System.Windows.Forms.Timer计时器,以便tick事件在UI中运行线程。

关于c# - 从 gui 异步执行方法的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12899712/

相关文章:

c# - 添加 post 值并重定向 c#

c# - Rhino Mocks - 如果调用方法则设置属性

创建一个新线程(C,Windows)

在单独的线程上运行的android服务

c# - 从 OData 返回单个实体 - .Net

c# - 将 IHttpActionResult 序列化为 JSON 会导致异常

c# - word cursor is on的获取方式,在WPF RichTextBox控件中

c++ - 必须在 std::vector<std::thread> 中加入 std::thread 两次以避免从线程 dtor 终止

Python 主线程中断

asp.net - 我应该使用Application.Lock()吗?