gpt4 book ai didi

c# - 如何在已经运行的线程上执行函数?

转载 作者:行者123 更新时间:2023-11-30 17:32:44 26 4
gpt4 key购买 nike

我有一个线程 A,它使用计时器每 5 秒调用一次 FunctionX()。但有时我需要立即从另一个线程线程 B 获取 FunctionX() 的值,而不能等待计时器执行。我不能直接从线程 B 调用 FunctionX(),因为它使用了一些外部组件,如果从另一个线程而不是原始线程调用,这些组件就会死亡。所以FunctionX()必须一直运行在线程A上。如何在线程B上即时获取FunctionX()的值而不用等待定时器调用函数?

最佳答案

这将取决于您使用的计时器类型,但是 System.Threading.Timer举个例子,类公开了一个 Change您可以用来说服计时器现在触发的方法。这是控制台应用程序测试工具中的示例:

using System;
using System.Threading;

namespace FiringTheTimerTestHarness
{
class Program
{
public static Thread _worker;
public static Timer _timer;
static void Main(string[] args)
{
_worker = new Thread(new ThreadStart(ThreadWorker));
_worker.Start();
var startTime = DateTime.Now;
// Simulate the main UI thread being active doing stuff (i.e. if there's a Windows Forms app so we don't need anything to
// keep the app "alive"
while (1==1)
{
Thread.Sleep(100);
if (startTime.AddSeconds(30) < DateTime.Now)
{
// Lets pretend that we need to fire the timer *now* so that we can get the result *now*
_timer.Change(0, 5000);
}
}
}

public static void ThreadWorker()
{
_timer = new Timer(new TimerCallback(DoStuffEveryFiveSeconds), null, 5000, 5000);
while (1 == 1)
{
Thread.Sleep(100);
}
}

public static void DoStuffEveryFiveSeconds(object state)
{
Console.WriteLine("{0}: Doing stuff", DateTime.Now);
}
}
}

您会看到如下所示的输出:

05/09/2017 10:04:44: Doing stuff

05/09/2017 10:04:49: Doing stuff

05/09/2017 10:04:54: Doing stuff

05/09/2017 10:04:59: Doing stuff

05/09/2017 10:05:04: Doing stuff

05/09/2017 10:05:09: Doing stuff

05/09/2017 10:05:09: Doing stuff

05/09/2017 10:05:09: Doing stuff

05/09/2017 10:05:09: Doing stuff

05/09/2017 10:05:09: Doing stuff

因此,计时器每五秒触发一次(如预期的那样),然后开始每 100 毫秒触发一次(即“按需”)。此代码位于设计的测试工具中,所以看起来有点奇怪,但其目的基本上是向您展示调用 Change 方法的结果。

关于c# - 如何在已经运行的线程上执行函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46050794/

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