在异步任务中运行各种命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在异步任务中运行各种命令相关的知识,希望对你有一定的参考价值。

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

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

任何帮助赞赏。谢谢

答案

生产者 - 消费者的例子

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");

    }
}

以上是关于在异步任务中运行各种命令的主要内容,如果未能解决你的问题,请参考以下文章

从片段中调用分离的异步任务类

在 TabLayout 和 ViewPager2 中执行异步任务后更新具有相同布局的多个片段

当活动中的异步任务完成时如何在片段中重新加载ui?

异步任务类完成后如何更改文本视图的值(在片段中)?

异步任务片段背景数据

Android 我应该在异步任务中将片段作为弱引用传递吗?