gpt4 book ai didi

c# - 使对象响应按钮单击

转载 作者:行者123 更新时间:2023-11-30 17:49:20 25 4
gpt4 key购买 nike

我正在寻找一种方法来获取具有正在运行的进程的对象以响应 Windows 窗体按钮单击。此实用程序中的所有内容都发生在一个“主”Windows 应用程序窗体上。

这个过程正在咀嚼文件夹中的一堆文件,我想在表单上放置一个“暂停”按钮。

我可以创建一个全局变量,使用按钮更改其状态,然后让对象在其过程中检查变量的状态。

但我想编写更好的软件,我怀疑有一种方法可以使用委托(delegate)、事件或某种形式的监听器设计模式,或者...,来更优雅地做到这一点。

想法?

最佳答案

处理此问题的最佳方法是将长时间运行的进程置于后台线程中。这可以通过 BackgroundWorker 完成,并且是我在 Windows 应用程序中选择的类。为什么?因为当通过它报告进度时(例如更改按钮的状态),它会自动处理线程切换到 UI 线程。

这是它如何工作的一个例子。假设您有一个用于 BackgroundWorker 的私有(private)类字段:

private BackgroundWorker _worker = new BackgroundWorker();

在构造函数中我们需要设置一些东西:

_worker.WorkerReportsProgress = true;

_worker.DoWork += DoWork;
_worker.ProgressChanged += ProgressChanged;
_worker.RunWorkerCompleted += RunWorkerCompleted;

好的,现在设置处理程序:

private void DoWork(object sender, DoWorkEventArgs e)
{
// do the work here
}

private void ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// e.UserState is a value that you can pass anything to
// like a string for a status label

// e.ProgressPercentage is an integer that you specify letting
// this event know what step the process is at - this is well
// used for a progress bar
}

private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// e.Result is a value that you can pass anything to
// like a reference to an object with the finished product
// or whatever makes sense in your case
}

最后,要运行后台进程,只需执行以下操作:

_worker.RunWorkerAsync();

并报告进度,同时在 DoWork 处理程序中,执行以下操作:

// NOTE: make sure to pass AT LEAST a value of 1 for the percentage
// or the event handler will NEVER fire. Further, someValue can be anything
// an instance of an object with data or just a string, or nothing for that
// matter - it's up to you
_worker.ReportProgress(1, someValue);

关于c# - 使对象响应按钮单击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21910570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com