同时运行两个函数

时间:2017-03-06 13:16:07

标签: c# multithreading context-switch round-robin

我想一个接一个地运行两个函数来访问第三个函数,条件是当第一个函数使用第三个函数时,第二个函数应该等待。在第一次访问第三个函数之后,它应该能够使用第三个函数。

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

编辑:其实我在谷歌地图上绘制标记,使用gmap.net .i为这两个标记创建了两个线程函数。他们将从两个单独的文件中获取所需的数据。将其转换为lat long并绘制在map.with这种方法我创建了两个具有相同功能的重复功能。但我想它不是一个好的编程方式,所以想要使用一个常用函数来绘制和从文件中提取数据进行转换。

所以当一个线程正在访问公共函数时,另一个线程应该等待.once首先释放一个函数或者它超出该函数的时间段它应该执行上下文切换而第二个线程应该访问公共函数。 这就是我想要实现的目标。如果我应该修改我的方法,请告诉我。 enter image description here

1 个答案:

答案 0 :(得分:8)

听起来像带锁的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