【问题标题】:Running various commands within an async task在异步任务中运行各种命令
【发布时间】:2018-08-31 22:23:21
【问题描述】:

我有一个静态类,该类中有一个异步任务,它针对串行端口连续运行处理设置命令。如果我向程序员公开一个包含方法和属性的公共类,那么在异步任务中按需执行这些方法和属性的最佳方法是什么?我将如何触发异步任务中的某些内容以接受并运行各种命令?有没有一种模式或明显的方法可以做到这一点?

我这样做的原因是我想从与任务相同的线程运行所有命令。有些命令是预先确定的并内置在任务中,有些命令来自外部环境,如脚本或 com 对象,但它们都转到同一个串行端口,需要以安全的方式处理。

任何帮助表示赞赏。 谢谢

【问题讨论】:

  • 这听起来像是一个标准的生产者-消费者问题。生产者提供命令,消费者是处理命令的任务。尝试查找有关如何在您的代码中实现这一目标的示例和文档。

标签: c# architecture


【解决方案1】:

生产者-消费者示例

public partial class Form1 : Form
{
    private CancellationTokenSource _cts;

    public Form1()
    {
        InitializeComponent();

    }

    private void Producer()
    {
        var id = 0;
        while (true )
        {
            CommandPool.Commands.Add($"Command {++id}");

            Thread.Sleep(500);

            if (_cts.IsCancellationRequested)
            {
                CommandPool.Commands.CompleteAdding();
                break;
            }
        }
        Debug.WriteLine("Producer finished");

    }

    private void Start(object sender, EventArgs e)
    {
        _cts = new CancellationTokenSource();
        CommandsComsumer.Run(_cts.Token);

        Task.Run(() => Producer(), _cts.Token);
    }

    private void Stop(object sender, EventArgs e)
    {
        _cts.Cancel();
    }
}

public static class CommandPool
{
    public static readonly BlockingCollection<string> Commands = new BlockingCollection<string>();
}

public static class CommandsComsumer
{
    private static CancellationToken _token;

    public static Task Run(CancellationToken cancellationToken)
    {
        _token = cancellationToken;
        return Task.Factory.StartNew(Consume, cancellationToken);
    }

    private static void Consume()
    {
        foreach (var cmd in CommandPool.Commands.GetConsumingEnumerable())
        {
            Debug.WriteLine(cmd);
        }

        Debug.WriteLine("Consumer finished");

    }
}

【讨论】:

  • 让我检查一下是否有任何后续问题,但它看起来很有趣,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 2017-02-07
相关资源
最近更新 更多