Me gustaría crear una tarea para que se ejecute serie de comandos. En este momento no necesito a devolver nada de el método que está haciendo el trabajo. Esto probablemente va a cambiar más adelante, pero ahora soy curioso en cuanto a cómo este.

Esto es lo que tengo. Me gustaría utilizar un método separado para la tarea en lugar de crear un anónimo acción. He intentado devolver vacío, con el resultado de «void no puede convertirse explícitamente a una Tarea». También he probado. Task<void>. La Última cosa que he intentado es devolver una Tarea, pero recibo el error «No todas las rutas de Código devuelve un valor» y «no se Puede implicily convertir vacío para el tipo de tarea»

Devolver una Tarea a partir de un método con el tipo void

En el pase, he utilizado un Hilo para ello, pero me gustaría utilizar Tareas en todo este tiempo.

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:

Al final esta es mi la solución completa

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;
    }
}
  • acabo de volver de Task?
  • Async/Await – Mejores Prácticas en la Programación Asincrónica
  • La Última cosa que he intentado es devolver una Tarea, pero no sé cómo generar una Simple Tarea nueva. Parece que usted necesita para asignar una acción a cuando me llama al constructor. Entonces, ¿cómo puedo hacer eso?
  • lo constructor? ¿qué acción? ¿qué es un «simple tarea nueva»? Si una Tarea no tiene un «valor de retorno» es sólo una Tarea. Si quieres devolver algo que el uso de los medicamentos genéricos es decir, la Tarea<T>. Usted no tiene que pesar. Podría explicar por qué el uso de Task es incorrecta?
  • Estás buscando Task.FromResult()?
  • Pregunta Actualizado con captura de pantalla

InformationsquelleAutor TheColonel26 | 2016-09-23

2 Comentarios

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

    También su RunSequence() debe devolver Task en lugar de void.

    Realidad, si usted espera Task el resultado sería el mismo:

    SequenceTask = await doSequence();
    • Esto llegó a ser el más cercano. En la final que necesitaba para hacer SequenceTask = await Task.Factory.StartNew(async () => { await doSequence(); });
    • Tarea.Run() que es más respetuoso con los gatitos
  2. 5

    Marca doSequence como async (suponiendo que se utiliza await):

    private async Task doSequence()

    También, es una buena idea para volver este Task en el delegado de pasar a Task.Run:

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

    Me gustaría crear una tarea para que se ejecute comandos serie en.

    Esto me lleva a creer que el uso de async y Task puede no ser la mejor solución para su situación. Yo sugiero que busque en TPL de flujo de datos.

Dejar respuesta

Please enter your comment!
Please enter your name here