我想创建一个运行串行命令的任务。这时我不需要从正在进行工作的方法中返回任何内容。这可能会在以后改变,但我现在很好奇这是怎么回事。
这就是我所拥有的。我想为该任务使用单独的方法,而不是创建匿名操作。我试过返回void,结果为" void无法显式转换为Task"。我也试过了。 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;
在传球中,我使用了一个线程来完成此任务,但这次我想使用任务。
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}}
答案 0 :(得分:5)
只需将doSequence
标记为async
(假设它使用await
):
private async Task doSequence()
此外,最好在您传递给Task
的代理中返回此Task.Run
:
SequenceTask = await Task.Run(() => doSequence());
我想创建一个运行串行命令的任务。
这让我相信使用async
和Task
可能不是您的方案的最佳解决方案。我建议你研究一下TPL Dataflow。
答案 1 :(得分:2)
SequenceTask = await Task.Factory.StartNew(async() => { await doSequence(); });
此外,您的RunSequence()
应该返回Task
而不是void
。
实际上,如果您等待Task
这应该导致相同的结果:
SequenceTask = await doSequence();