Return a Task from a method with type void

15,473

Solution 1

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

Also your RunSequence() should return Task instead of void.

Actually if you await the Task this should result in the same:

SequenceTask = await doSequence();

Solution 2

Just mark doSequence as async (assuming it uses await):

private async Task doSequence()

Also, it's a good idea to return this Task in the delegate you pass to Task.Run:

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

I would like to create a task to run serial commands on.

This leads me to believe that using async and Task may not be the best solution for your scenario. I suggest you look into TPL Dataflow.

Share:
15,473
TheColonel26
Author by

TheColonel26

I develop software and control systems for automated machines.

Updated on June 04, 2022

Comments

  • TheColonel26
    TheColonel26 almost 2 years

    I would like to create a task to run serial commands on. At this time I do not need to return anything from the method that is doing the work. This will probably change later, but I am now curious as to how this.

    This is what I have. I would like to use a separate method for the task instead of creating an anonymous action. I have tried returning void, with the result of "void can not be explicitly converted to a Task". I have also tried. Task<void>. The Last thing I have tried is returning a Task, but I receive, error "Not all Code paths return a value" and "Can not implicily convert void to type task"

    enter image description here

    In the pass I have used a Thread to accomplish this, but I'd like to use Tasks this time around.

    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:

    In the end this is my the complete solution

    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;
        }
    }
    
  • TheColonel26
    TheColonel26 over 7 years
    This got be the closest. In the end I needed to do SequenceTask = await Task.Factory.StartNew(async () => { await doSequence(); });
  • MickyD
    MickyD over 7 years
    Task.Run() is kinder to kittens