c# - 同时运行两个函数

标签 c# multithreading context-switch round-robin

我想一个接一个地运行两个访问第三个函数的函数,条件是当第一个函数使用第三个函数时,第二个函数应该等待。应该可以在第一个访问第三个函数的时间段结束后使用第三个函数。

这个概念听起来像是通过上下文切换实现循环调度。我从理论上知道这一点,但我想实际应用它。我怎样才能做到这一点并进行上下文切换?有人可以给我举个例子吗?还有其他方法可以实现这一目标吗?

编辑:实际上我正在使用 gmap.net 在谷歌地图上绘制标记。我为两个标记创建了两个线程函数。它们将从两个单独的文件中获取所需的数据。将其转换为经纬度并绘制map.with this approach I am creating duplicate functions for both having same functionality.but I guess its not a good way of programming so want to use one common function for plotting and fetching data from file to convert.

因此,当一个线程正在访问公共(public)函数时,另一个线程应该等待。一旦第一个线程释放函数或超过其处理该函数的时间段,它应该执行上下文切换,第二个线程应该访问公共(public)函数。 这就是我想要实现的目标。如果我应该修改我的方法,请告诉我。 enter image description here

最佳答案

听起来像 2 个带锁的任务应该做你想做的:

class Program
{
    static void Main(string[] args)
    {
        var task1 = Task.Run(() => Func1());
        var task2 = Task.Run(() => Func2());

        Task.WaitAll(task1, task2);
    }

    static object lockObj = new object();

    static void Func1()
    {
        for (int i = 0; i < 10; i++)
        {
            Func3("Func1");
            Thread.Sleep(1);
        }
    }

    static void Func2()
    {
        for (int i = 0; i < 10; i++)
        {
            Func3("Func2");
            Thread.Sleep(1);
        }
    }

    static void Func3(string fromFn)
    {
        lock(lockObj)
        {
            Console.WriteLine("Called from " + fromFn);
        }
    }
}

锁定防止封闭的代码同时在多个线程中运行。 (Sleep 语句纯粹是为了演示目的而减慢函数速度 - 它们在您的最终代码中没有位置)。

输出是:

Called from Func2
Called from Func1
Called from Func2
Called from Func1
Called from Func2
Called from Func1
Called from Func1
Called from Func2
Called from Func1
Called from Func2

关于c# - 同时运行两个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42626632/

相关文章:

c# - 如何使用 C# 还原 SQL Server 数据库,即使它正在使用中

c# - 返回模型但它为空

multithreading - 如何管理 TCP 客户端读/写重叠问题?

c++ - 无法在c++中的动态加载插件中成功调用函数

Java:客户端、客户端、(线程)服务器、流客户端信息、JPanel 创建但消息(?)阻止游戏开始

linux - 上下文切换的开销是多少?

linux - 编写系统调用来计算进程的上下文切换

c# - 无法在 .NET 项目中使用 PerUserRoaming 参数保存配置文件

c# - C# 如何让进度条在不同的线程中运行

c - MSP430 执行库