2017-03-06 162 views
5

我想依次运行两个函数,它们访问第三个函数的条件是,当第一个函数使用第三个函数时,第二个函数应该等待。在第一次访问第三个函数之后,应该可以使用第三个函数。同时运行两个函数

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

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

所以当一个线程正在访问公共函数时,另一个应该等待。第一个释放函数或其时间段来处理该函数超过它应该执行上下文切换,第二个线程应该访问公共函数。 这是我想要实现的。如果我应该修改我的方法,请让我知道。 enter image description here

+1

请展示细节多一点你的意思,也许它写在伪代码,或给一个流程图应该如何,造成此段文字不利于我例如那么多 – Icepickle

+1

改说你的问题,所以它更容易阅读,也可以添加一些你试过的代码等。 –

+0

@Ipickle请找到更新的问题.. –

回答

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 
+0

这并不一定做OP想要的东西。不能保证两种功能均匀交替。 – InBetween

+1

@InBetween:嗯......我没有看到任何指定'even'的需求。但是这个问题在这个领域并不明确。 :) – Baldrick

+0

它不是,但*“我想要一个接一个地运行两个函数......”*让我感到奇怪,因此评论清楚地表明您的解决方案不会强制执行它。除此之外,它是一个很好的答案。 – InBetween