簡體   English   中英

從類型為void的方法返回任務

[英]Return a Task from a method with type void

我想創建一個運行串行命令的任務。 這時我不需要從正在進行工作的方法中返回任何內容。 這可能會在以后改變,但我現在很好奇這是怎么回事。

這就是我所擁有的。 我想為該任務使用單獨的方法,而不是創建匿名操作。 我試過返回void,結果是“void無法顯式轉換為Task”。 我也試過了。 Task<void> 我嘗試過的最后一件事是返回一個任務,但是我收到了,錯誤“並非所有代碼路徑都返回一個值”和“不能隱含地將void轉換為類型任務”

在此輸入圖像描述

在傳遞中我使用了一個Thread來完成這個,但是這次我想使用Tasks。

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

    }
}

ETA:

最后,這是我的完整解決方案

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;
    }
}

只需將doSequence標記為async (假設它使用await ):

private async Task doSequence()

此外,在傳遞給Task.Run的委托中返回此Task是個好主意:

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

我想創建一個運行串行命令的任務。

這讓我相信使用asyncTask可能不是您的場景的最佳解決方案。 我建議你研究一下TPL Dataflow。

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

你的RunSequence()應該返回Task而不是void

實際上,如果您等待Task這應該導致相同:

SequenceTask = await doSequence();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM