Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 同步多个线程_C#_.net_Multithreading - Fatal编程技术网

C# 同步多个线程

C# 同步多个线程,c#,.net,multithreading,C#,.net,Multithreading,我在.NET中有一个多线程环境,需要与库通信。该库有一些限制,因此无法在多线程环境中正常工作。我需要一种方法来解决这个问题,方法是让多线程环境与中间层通信,然后调用库。我提出了一个解决问题的办法,但我不相信这是最好的办法。我创建了一个具有run方法的异步线程。run方法位于无限循环中,它检查当前任务是什么(我设置的一个参数),并执行相应的方法 正如我所说,我完全不相信这个解决方案,但它正确地完成了任务。因此,请告诉我是否有更好的方法来解决它(特别是当它与C#相关时) 正如旁注,限制不是由于多个线

我在.NET中有一个多线程环境,需要与库通信。该库有一些限制,因此无法在多线程环境中正常工作。我需要一种方法来解决这个问题,方法是让多线程环境与中间层通信,然后调用库。我提出了一个解决问题的办法,但我不相信这是最好的办法。我创建了一个具有run方法的异步线程。run方法位于无限循环中,它检查当前任务是什么(我设置的一个参数),并执行相应的方法

正如我所说,我完全不相信这个解决方案,但它正确地完成了任务。因此,请告诉我是否有更好的方法来解决它(特别是当它与C#相关时)

正如旁注,限制不是由于多个线程同时工作并导致数据损坏。我需要完全相同的线程来执行所有操作(取决于线程id)。

请查看

我建议您实现一个自定义线程,在同一线程上调度所有任务。您可以使用调度程序来调度(无结果值)或(类型为T的结果)

您可以使用包装来实现调度程序

例如,假设您的库公开函数MakeCoffee,您可以创建一个类CoffeeMachine,该类提供匹配的包装器方法,并在自定义调度程序上调度调用库的任务:

public class CoffeeMachine
{
    private readonly TaskScheduler scheduler;

    public CoffeeMachine()
    {
        this.scheduler = new SingleThreadTaskScheduler();
    }

    public Task<Coffee> MakeCoffeeAsync()
    {
        return Task.Factory.StartNew<Coffee>(
            this.MakeCoffee,
            CancellationToken.None,
            TaskCreationOptions.None,
            this.scheduler);
    }

    private Coffee MakeCoffee()
    {
        // this method will always execute on the same thread
    }
}
公共级咖啡机
{
专用只读任务调度器;
公共咖啡机()
{
this.scheduler=新的SingleThreadTaskScheduler();
}
公共任务MakeCoffeeAsync()
{
return Task.Factory.StartNew(
这个,煮咖啡,
取消令牌。无,
任务创建选项。无,
这是调度程序);
}
私人咖啡
{
//此方法将始终在同一线程上执行
}
}
用法:

咖啡机=新咖啡机();
Task Task=machine.MakeCoffeeAsync();//启动任务
task.Wait();//等待任务完成
喝酒(任务。结果);//使用结果

你的方法听起来不错。当没有挂起的任务时,具有无限循环的线程应该休眠。您的实现是否做到了这一点?如果没有,请发布一些代码,以便我们可以帮助您。您可能需要使用包装a。您还可以实现一个自定义,在同一线程上调度所有任务。感谢@dtb的响应。是的,当没有挂起的任务并且有可能对资源进行多线程访问的锁时,我使用sleep()。它工作得很好,我没有任何问题。我只是不确定这样做是否正确。关于TaskScheduler,我还需要方法的输出。这是我最大的问题。在我的解决方案中,我创建了一个名为“result”的参数,它始终是输出。因此,我检查任务状态何时完成,然后得到结果。线程等待状态为completedSleep()不是一个好主意,因为您希望线程在有新任务时立即唤醒,而不是每x秒唤醒一次以检查是否有新任务。我绝对建议实现一个TaskScheduler,在同一个线程上调度所有任务。您可以计划一个(无结果)或一个(类型为T的结果)。这两个类都支持等待任务完成或在完成时异步调用回调。
CoffeeMachine machine = new CoffeeMachine();

Task<Coffee> task = machine.MakeCoffeeAsync();   // start task

task.Wait();                                     // wait for task to complete
Drink(task.Result);                              // use result