[英]The return type of an async method must be void, Task or Task<T> in C#
[英]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());
我想創建一個運行串行命令的任務。
這讓我相信使用async
和Task
可能不是您的場景的最佳解決方案。 我建議你研究一下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.