从类型为void的方法返回任务

时间:2016-09-23 12:59:10

标签: c# task

我想创建一个运行串行命令的任务。这时我不需要从正在进行工作的方法中返回任何内容。这可能会在以后改变,但我现在很好奇这是怎么回事。

这就是我所拥有的。我想为该任务使用单独的方法,而不是创建匿名操作。我试过返回void,结果为&#34; void无法显式转换为Task&#34;。我也试过了。 internal class Hardware { private EventHandler<SequenceDoneEventArgs> SequenceDone; private List<Step> Steps; private System.IO.Ports.SerialPort comport = null; private Task SequenceTask; private CancellationTokenSource RequestStopSource; private CancellationToken RequestStopToken; private void Initialize() { comport = new System.IO.Ports.SerialPort("COM2", 115200, System.IO.Ports.Parity.None,8); comport.DataReceived += Comport_DataReceived; } public async void RunSequence() { if (comport == null) { Initialize(); } if (!comport.IsOpen) { comport.Open(); } RequestStopSource = new CancellationTokenSource(); RequestStopToken = RequestStopSource.Token; SequenceTask = await Task.Run(() => { doSequence(); }); } private Task doSequence() { //** Run Sequence stuff here } } 。我尝试过的最后一件事是返回一个任务,但我收到了,错误&#34;并非所有代码路径都返回一个值&#34;和&#34;不能暗示将void转换为类型任务&#34;

enter image description here

在传球中,我使用了一个线程来完成此任务,但这次我想使用任务。

internal class Hardware
{
    private EventHandler<SequenceDoneEventArgs> SequenceDone;

    private List<Step> Steps;
    private System.IO.Ports.SerialPort comport = null;

    private Task SequenceTask;
    private CancellationTokenSource RequestStopSource;
    private CancellationToken RequestStopToken;


    private void Initialize()
    {
        comport = new System.IO.Ports.SerialPort("COM2", 115200, System.IO.Ports.Parity.None,8);
        comport.DataReceived += Comport_DataReceived;
    }

    public async void RunSequence()
    {
        if (comport == null)
        {
            Initialize();
        }
        if (!comport.IsOpen)
        {
            comport.Open();
        }

        RequestStopSource = new CancellationTokenSource();
        RequestStopToken = RequestStopSource.Token;

        SequenceTask = await Task.Factory.StartNew(async () => { await doSequence(); });

    }

    private Task doSequence()
    {
        //** Run Sequence stuff here

        //return null;
        return Task.CompletedTask;
    }
}

ETA:

最后,这是我的完整解决方案

{{1}}

2 个答案:

答案 0 :(得分:5)

只需将doSequence标记为async(假设它使用await):

private async Task doSequence()

此外,最好在您传递给Task的代理中返回此Task.Run

SequenceTask = await Task.Run(() => doSequence());
  

我想创建一个运行串行命令的任务。

这让我相信使用asyncTask可能不是您的方案的最佳解决方案。我建议你研究一下TPL Dataflow。

答案 1 :(得分:2)

SequenceTask = await Task.Factory.StartNew(async() => { await doSequence(); });

此外,您的RunSequence()应该返回Task而不是void

实际上,如果您等待Task这应该导致相同的结果:

SequenceTask = await doSequence();