【问题标题】:How to run 2 functions simultaneously? [duplicate]如何同时运行 2 个功能? [复制]
【发布时间】:2016-08-23 07:44:17
【问题描述】:

我知道这个问题已经被回答了一千次,但我仍然无法让这些功能同时工作。这是我的代码:

static void Main(string[] args)
{
    a();
    a();
}

static void a()
{
    string sampleString = "a";
    Console.WriteLine(sampleString);

    for (int i = 0; i < 10; i++)
    {
        System.Threading.Thread.Sleep(TimeSpan.FromSeconds(0.1));
        Console.SetCursorPosition(0, Console.CursorTop -1);
        sampleString = " " + sampleString;
        Console.WriteLine(sampleString);
    }
}

该函数只写字母'a',并在0.1秒后在其后面添加一个空格,并不复杂。函数结束后,它再次执行相同的操作。我希望这两个函数同时工作,第一行中的第一个函数和第二行中的第二个函数。 提前致谢。

【问题讨论】:

  • 异步编程是一个非常广泛的话题。我建议阅读Asynchronous Programming Patterns
  • 如果这个问题已经被回答了一千次,为什么你没有实施任何解决方案而不是再次提问?
  • 他正在寻求一种方法来返回之前输出的行并为其添加空间。
  • 同时没有任何意义。即使使用异步编程(这就是您所追求的),您的计算机一次也只能处理一项任务。但是,您可以非常快速地在并行任务之间切换,让您感觉它同时发生。
  • 类似Parallel.Invoke(() =&gt; a(); () =&gt; a());Parallel.For(0, 10, i =&gt; whatever);?

标签: c# asynchronous


【解决方案1】:

你可以使用Parallel类:

static void Main(string[] args)
{
    Parallel.Invoke(a,a);
}

您的函数将同时运行。

【讨论】:

    【解决方案2】:

    一个简单的解决方案是创建两个线程,启动它们并等待它们完成。对于您的具体问题:

    static void Main(string[] args)
    {
        var t1 = new Thread(a); t1.Start();
        var t2 = new Thread(a); t2.Start();
        t1.Join(); t2.Join();
    }
    

    当然,这并不能解决您最初的问题,写入控制台的不同行,因为a 函数不知道该写入哪一行。您可以通过添加带有行号的参数来解决此问题。

    此外,您必须通过锁来保护控制台输出,因为它是一个目标,多个源将数据写入其中,如果同步不正确,可能会导致不一致。所以我真的建议你阅读一些关于多线程的教程。

    【讨论】:

    • @超验关怀解释一下?
    • 定义“最简单”。你看到罗马的回答了吗?
    • @roryap 点数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    相关资源
    最近更新 更多