在 Windows 窗体应用程序中永远循环

2023-12-11

我正在使用 Visual C#,并且我正在使用 Windows 窗体而不是控制台应用程序。因此我不是在 Main () 中工作,而是在表单文件中工作。我对 C# 也很陌生,如果我的一些问题很愚蠢,我很抱歉。

我基本上需要做的是,当我的程序启动时,我需要它永远循环。因为我没有 Main (),所以我应该把这段代码放在哪里?我是否将它放在包含 InitializeComponent() 的函数中?我需要在程序启动后立即启动循环。但是,我需要在循环之前首先声明一些变量。所以基本上我需要声明变量,然后启动无限循环。变量是全局的。

其次,我需要在用户按下按钮时中断无限循环。我该怎么做?我在想一些事情:

while (buttonIsPressed == false)
{
   //do whatever I need to do
}

然而,我意识到按钮的功能永远不会被调用,因为我陷入了那个循环。如果由于处于无限循环中而永远无法到达按钮的功能,我无法从按钮的功能设置变量。有任何想法吗?我正在考虑线程,但我完全没有线程方面的经验,所以我有点不愿意尝试。


另外,来自评论:

一款聊天应用程序。当程序启动时我需要它保留 听。但是,当用户单击“连接”时,它会停止监听 并启动一个连接

我正在创建一个聊天客户端。所以基本上当我的程序启动时,我 需要它来继续聆听。但是,当用户单击“连接”时 需要停止监听并发起连接


对于来自(完全)不同背景的人来说,这是一个自然的问题。

Windows 窗体应用程序编程是事件驱动的。当 Windows 窗体应用程序启动时,会加载一个窗体(检查 Program.cs 文件),并且有一个隐藏的主循环,让您可以专注于程序中的重要内容。

您不需要在主循环中放置任何内容来响应事件(例如按钮单击事件)。您只需通过为按钮的 Click 事件创建事件处理程序来处理按钮单击事件。您可以使用设计器或在代码中手动执行此操作。

当您创建一个方法来处理事件(因此该方法称为事件处理程序)时,它会在引发/触发事件时自动调用。例如,当用户单击按钮时,将调用表单上按钮的 Click 事件的方法处理程序。

此 MSDN 主题包含您需要的所有信息:在 Windows 窗体中创建事件处理程序。如果您需要更多说明,请询问! :)

UPDATE:像上面一样创建一个事件处理程序,并在 Form_Loaded 事件处理程序中创建一个循环。一定要打电话应用程序.DoEvents(); inside循环。这样,可以处理按钮单击的事件处理程序(在处理程序中添加代码来修改布尔值,该布尔值将使循环的条件为 false 以取消循环)。

更新2:为了使这个答案更加完整,我提到您还应该考虑在新线程而不是 UI 线程上运行循环(因此避免需要使用 DoEvents,正如我的同行指出的那样,它有其缺点)。以下示例显示如何创建线程并在单击按钮时取消它:

    System.Threading.Thread t;
    private void Form1_Load(object sender, EventArgs e)
    {
        //create and start a new thread in the load event.
        //passing it a method to be run on the new thread.
        t = new System.Threading.Thread(DoThisAllTheTime);
        t.Start();
    }

    public void DoThisAllTheTime()
    {
        while (true)
        {
            //you need to use Invoke because the new thread can't access the UI elements directly
            MethodInvoker mi = delegate() { this.Text = DateTime.Now.ToString(); };
            this.Invoke(mi);
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //stop the thread.
        t.Suspend();
    } 

最后,考虑使用后台工作者它为您封装了创建和管理线程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Windows 窗体应用程序中永远循环 的相关文章

  • Dapper 强类型查询返回默认对象值

    刚刚开始使用 Dapper 并喜欢它 我遇到了问题 它返回正确数量的对象 但它们的属性都有默认值 using var dbConnection Connection await dbConnection OpenAsync const st
  • C++ 有像 Pascal 一样的“with”关键字吗?

    withPascal 中的关键字可用于快速访问记录的字段 有人知道 C 是否有类似的东西吗 前任 我有一个包含许多字段的指针 但我不想这样输入 if pointer gt field1 pointer gt field2 pointer g
  • C/C++ 中随机数生成器的实现[重复]

    这个问题在这里已经有答案了 我对 C 中随机数生成器的实现有点困惑 它也与 C 中的明显不同 如果我理解正确 对 srand seed 的调用会以某种方式初始化可通过 rand 访问的隐藏变量 种子 该变量又将函数指向预先生成的序列 例如例
  • 如何在 C++ 的子目录中创建文件?

    这是我的代码 如何在子目录联系人中创建文件 每次创建该文件时 它都会出现在与我的程序相同的目录中 int main ofstream myfile contacts myfile open a myfile close 在构造函数中指定完整
  • C++ 模板参数类型推断

    我有一个这样的C 模板 template
  • 未定义异常变量时通过引用捕获

    捕获异常时 标准指导是按值抛出 按引用捕获 据我了解 这有两个原因 如果由于内存不足异常而引发异常 我们将不会调用可能终止程序的复制构造函数 如果异常是继承层次结构的一部分 我们可能会对异常进行对象切片 如果我们有一个场景 我们没有在 ca
  • initializer_list 和默认构造函数重载决策

    include
  • 使用正则表达式匹配以“Id”结尾的单词?

    如何组合一个正则表达式来匹配以 Id 结尾的单词并进行区分大小写的匹配 试试这个正则表达式 w Id b w 允许前面的单词字符Id和 b确保Id位于单词末尾 b是字边界断言
  • C++ 析构函数:何时释放内存?

    如果我删除一个导致其析构函数被调用的对象 那么内存是在析构函数完成函数中的任何操作之前还是之后被释放 仅当最小派生类子对象被销毁后才会释放内存 所以如果你有 class Base class Derived public Base publ
  • 从 ef core 的子集合中删除一些项目

    我有一个父表和子表 其中父表与子表具有一对多关系 我想删除一些子项 并且希望父项的子集合反映该更改 如果我使用删除选定的子项RemoveRange 那么子集合不会更新 如果我使用Remove从子集合中删除子集合然后 显然 它不如使用效率高R
  • 在非指针变量和类成员上放置 new

    考虑以下示例 include
  • 在 C# 中生成随机值

    如何使用以下命令生成随机 Int64 和 UInt64 值RandomC 中的类 这应该可以解决问题 这是一个扩展方法 因此您可以像调用普通方法一样调用它Next or NextDouble上的方法Random目的 public stati
  • AspNetCore.SignalR:无法启动未处于初始状态的连接

    我无法让 ASP NET Core SignalR 应用程序正常运行 我有这个服务器端代码 public class PopcornHub Hub private int Users public async Task BroadcastN
  • 从存储过程返回 int 值并在 ASP.NET 代码中检查它以验证登录表单

    当我多次尝试但没有得到有效结果时 使此代码运行的真实顺序是什么 SQL存储过程的代码 set ANSI NULLS ON set QUOTED IDENTIFIER ON GO ALTER PROC dbo login proc usern
  • Unity 2.0 和处理 IDisposable 类型(特别是使用 PerThreadLifetimeManager)

    我知道类似的问题被问过好几次 例如 here https stackoverflow com questions 987761 how do you reconcile idisposable and ioc here https stac
  • 如何使用eclipse构建C++应用程序

    我已经从以下位置下载了 Eclipse Juno for C here http www eclipse org downloads download php file technology epp downloads release ju
  • 停止 TcpListener 的正确方法

    我目前正在使用 TcpListener 来处理传入连接 每个连接都有一个线程用于处理通信 然后关闭该单个连接 代码如下 TcpListener listener new TcpListener IPAddress Any Port Syst
  • 如何在Linux上构建GLFW3项目?

    我已经使用 cmake 和 make 编译了 glfw3 和包含的示例 没有出现任何问题 开始编写我的第一个项目 作为 opengl 和 glfw 的新手 并且对 C 和 CMake 没有经验 我正在努力理解示例构建文件 甚至要链接哪些库和
  • Visual Studio 2015默认附加库

    当我在 VS 2015 中创建一个空项目时 它会自动将这些库放入 附加依赖项 中 kernel32 lib user32 lib gdi32 lib winspool lib comdlg32 lib advapi32 lib shell3
  • 计算两个日期之间的工作日数?

    在C 中 如何计算business 或工作日 两个日期之间的天数 我以前曾经遇到过这样的任务 并且我已经找到了解决方案 当可以避免的时候 我会避免列举其间的所有日子 这里就是这种情况 正如我在上面的一个答案中看到的那样 我什至没有提到创建一

随机推荐

  • 为什么对派生类中的影子非虚拟成员函数的调用不调用基类成员函数?

    让我们在 Visual C 2010 中假设这个场景 include
  • 如果循环后没有匹配项,如何只得到一个答案

    我的代码在数组中有一个 for 循环 并且有 if 语句 如果没有匹配项 我只想得到一个答案 for int i 0 i lt arr Length i if arr i GetSomeValue gt 1 i GetSomeValue l
  • 如何检查 numpy 数组是否为空?

    如何检查 numpy 数组是否为空 我使用了以下代码 但如果数组包含零 则会失败 if not self Definition all 这是解决方案吗 if self Definition array 您可以随时查看 size属性 这是定义
  • 使用 2016 Facebook SDK 使页面访问令牌永不过期?

    我们正在构建的应用程序是一款 iOS 和 Android 移动应用程序 它将高中生与非营利组织配对 以帮助管理他们的 Facebook 页面 我们将每个学生分配到一个非营利组织 让他们成为 Facebook 页面的管理员 并允许他们代表该组
  • 如何在 Firestore (SWIFT) 中使用 FieldValue 减少值?

    阅读博客post和文档 我发现我们可以使用增加一个值FieldValue但我找不到减量函数 document fitness teams Team 1 updateData step counter FieldValue decrement
  • 查找当前流是否包含 ClearCase 中的基线

    假设我有一个名为 A1 的基线 然后我想看看是否有任何方法可以让我在同一个项目的任何地方进入另一个流 看看我的流中是否有 A1 IE 我的流中是否有 A1 中所做的代码更改 有什么快速的方法可以做到这一点吗 先感谢您 ClearCase 基
  • VBScript循环遍历文件夹中的所有文件

    我有在单个文件上执行该过程的代码 任何人都可以更改此脚本 以便它循环遍历目录 H Letter Display Letters 中文件类型为 的所有文件 LTR 并保存它们全部 Const ForReading 1 Const ForWri
  • $_GET 变量的编码混乱

    我在网站编码方面遇到了很多麻烦 这是我现在的问题 如果我去analize php dialog rbol哪个代码是
  • 使用 for 循环删除列表中的项目

    我有一个包含主题的数组 每个主题都有相关的时间 我想比较列表中的每个主题 如果有两个相同的科目 我想添加两个科目的时间 并且还想删除第二个科目信息 科目名称和时间 但是如果我删除该项目 列表就会变短 并且会出现超出范围的错误 我尝试使用 s
  • 使用 GhostScript 将 PDF 转换为服务器上的图像集合

    这些是我试图实现的步骤 在服务器上上传 PDF 文档 使用 GhostScript 将 PDF 文档转换为一组图像 每个页面都转换为图像 将图像集合发送回客户端 到目前为止 我感兴趣的是 2 首先 我下载了两个gswin32c exe an
  • Mahout row相似度

    我正在尝试计算维基百科文档之间的行相似度 我有 tf idf 向量的格式Key class class org apache hadoop io Text Value Class class org apache mahout math V
  • 如何读取Oracle集合类型的元素类型?

    我将 Oracle 集合类型定义为 type tab foo as table of obj foo Where obj foo定义为 type obj foo as object 通过致电 select from sys all type
  • ModuleNotFoundError:没有名为“pandas._libs.tslibs.timedeltas”的模块

    我是Python的学习者 执行我的脚本时出现问题 表明failed to execute script在通过 Pyinstaller 打包时 由于 ModuleNotFoundError 没有名为 pandas libs tslibs ti
  • 如何中止映射器(或减速器)内的 MR 作业

    我尝试在map方法中抛出IOExceptions 但MR作业没有停止 抛出大量 IOException 后作业将停止 有没有什么方法可以通过抛出异常或一些简单的调用来停止整个工作 谢谢 这不是 Hadoop 的理想用例 也不是一个好的实践
  • libusb-win32:自动安装驱动程序过滤器

    我在使用基于 libusb w32 的程序来检测设备时遇到了问题 该程序必须检测数码相机 我需要自动安装驱动程序过滤器 以便检测到任何新相机 而无需任何手动操作 我使用过 install filter i class 6BDD1FC6 81
  • 使用十进制数字生成可变颜色

    我创建了一个文件 其中第一列是十进制颜色线 第二列是 y 轴 x 轴是行号 0 0 1 1 2 2 然后我运行这个命令 plot test dat u 0 2 1 pt 7 ps 1 lc rgb variable 正如您在图片中看到的 输
  • 一个java文件如何调用另一个java文件的方法? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 如何在java中调用不同类 文件 的方法 是否需要对象 或者有第三种方法来合并java文档吗 我们可以使用简单的方法调用吗 有没有正确的方法来调用新方法 我不清楚你的问题 据我了解你想
  • 将 Vue 3 组件渲染为 HTML 字符串

    我正在开发一个 vue js 项目 版本 3 我遇到了一种情况 我想将组件的渲染 HTML 视图用于当前组件的方法 我在 Vue 项目中创建了以下 SVG 组件 CircleWithTextSvg vue
  • 在 Haskell 中使用“foldr”实现“member”函数

    我这样尝试过 member e False member e xs foldr e xs 进而 member 3 1 2 3 4 5 我收到此错误消息 No instance for Num Bool arising from the li
  • 在 Windows 窗体应用程序中永远循环

    我正在使用 Visual C 并且我正在使用 Windows 窗体而不是控制台应用程序 因此我不是在 Main 中工作 而是在表单文件中工作 我对 C 也很陌生 如果我的一些问题很愚蠢 我很抱歉 我基本上需要做的是 当我的程序启动时 我需要