【问题标题】:Return Messages From Multiple Task In One Method [closed]以一种方法从多个任务返回消息[关闭]
【发布时间】:2018-01-23 04:58:09
【问题描述】:

请考虑以下代码:

private async Task<string> DoSomeWorkAsync()
{
    var Task1 = await Task.Run(() => 
                {
                    Thread.Sleep(3000);
                    return "Message From Task 1";
                });

    var Task2 = await Task.Run(() => 
                {
                    Thread.Sleep(1000);
                    return "Message From Task 2";
                });

    var Task3 = await Task.Run(() => 
                {
                    Thread.Sleep(3000);
                    return "Message From Task 3";
                });

    return ?????;
}

任务 1 完成后如何获取消息?

编辑 1)

我希望表单在任务运行时响应。

【问题讨论】:

  • Task1.Result 会给你消息

标签: c# multithreading async-await task c#-6.0


【解决方案1】:

试试这个。
可能这不是解决这个问题的最优雅的方法,但也许它很有用。

这个会在 7 秒后返回所有任务。

private async sometype SomeMethodAsync()
{
    List<string> _ListOfMessages = new List<string>();

    _ListOfMessages = await DoSomeWorkAsync1();
    foreach (string _message in _ListOfMessages)
        Console.WriteLine("Message: {0}", _message);
}

private async Task<List<string>> DoSomeWorkAsync1()
{
    List<string> _StringsToReturn = new List<string>();

    _StringsToReturn.Add(await Task.Run(() =>
    {
        Thread.Sleep(3000);
        return "Message From Task 1";
    }));

    _StringsToReturn.Add(await Task.Run(() =>
    {
        Thread.Sleep(1000);
        return "Message From Task 2";
    }));

    _StringsToReturn.Add(await Task.Run(() =>
    {
        Thread.Sleep(3000);
        return "Message From Task 3";
    }));

    return _StringsToReturn;
}

这一次返回一个任务(在指定的延迟之后):
(编辑:忘记粘贴return _StringToReturn;

private async sometype SomeMethodAsync()
{
    for (int _Job = 1; _Job <= 3; _Job++)
    {
        string _Message = await DoSomeWorkAsync2(_Job);
        Console.WriteLine("Message: {0}", _Message);
    }
}

private async Task<string> DoSomeWorkAsync2(int _job)
{
    string _StringToReturn = string.Empty;

    switch (_job)
    {
        case 1:
        _StringToReturn = await Task.Run(() =>
        {
            Thread.Sleep(3000);
            return "Message From Task 1";
        });
        break;

        case 2:
        _StringToReturn = await Task.Run(() =>
        {
            Thread.Sleep(1000);
            return "Message From Task 2";
        });
        break;

        case 3:
        _StringToReturn = await Task.Run(() =>
        {
            Thread.Sleep(3000);
            return "Message From Task 3";
        });
        break;
    }
    return _StringToReturn;
}

如果这些任务需要级联其结果:
(与DoSomeWorkAsync1() 相同的调用)

private async Task<List<string>> DoSomeWorkAsync4()
{
    List<string> _StringsToReturn = new List<string>();

    _StringsToReturn.Add(await Task.Run(() =>
    {
        Thread.Sleep(3000);
        return "Task 1 completed";
    }).ContinueWith<string>(t => {

        Thread.Sleep(1000);
        return t.Result + " Task 2 completed";

    }).ContinueWith<string>(t =>{
        Thread.Sleep(3000);
        return t.Result + " Task 3 completed" + 
                            Environment.NewLine + "All tasks completed";
    }));

    return _StringsToReturn;
}

List(Class) - 打开属性值 (TaskID)

public class MyTask
{
    public int TaskID { get; set; }
    public string ReturnMessage { get; set; }
}

private async sometype SomeMethodAsync()
{
    List<MyTask> _ListOfTasks = new List<MyTask>();
    _ListOfTasks.Add(new MyTask { TaskID = 1, ReturnMessage = string.Empty });
    _ListOfTasks.Add(new MyTask { TaskID = 2, ReturnMessage = string.Empty });
    _ListOfTasks.Add(new MyTask { TaskID = 3, ReturnMessage = string.Empty });

    foreach (MyTask _task in _ListOfTasks)
    {
        _task.ReturnMessage = await DoSomeWorkAsync3(_task.TaskID);
        Console.WriteLine("Message: {0}", _task.ReturnMessage);
    }


private async Task<string> DoSomeWorkAsync3(int TaskID)
{
    string _StringToReturn = string.Empty;

    _StringToReturn = await Task.Run(() =>
    {
        switch (TaskID)
        {
            case 1:
                Thread.Sleep(3000);
                return "Message From Task 1";
            case 2:
                Thread.Sleep(1000);
                return "Message From Task 2";
            case 3:
                Thread.Sleep(3000);
                return "Message From Task 3";
            default:
                return string.Empty;
        }
    });

   return _StringToReturn;
}

【讨论】:

    【解决方案2】:
    private List<Task<string>> GetSomeWork()
    {
        var tasks = new List<Task<string>>();
    
        tasks.Add(await Task.Run(() => 
                    {
                        Thread.Sleep(3000);
                        return "Message From Task 1";
                    }));
    
        tasks.Add(await Task.Run(() => 
                    {
                        Thread.Sleep(1000);
                        return "Message From Task 2";
                    }));
    
        tasks.Add(await Task.Run(() => 
                    {
                        Thread.Sleep(3000);
                        return "Message From Task 3";
                    }));
    
        return tasks;
    }
    
    
    var tasks = GetSomeWork();
    
    while (tasks.Count > 0)
    {
        var task = await Task.WhenAny(tasks);
        var message = task.Result;
        tasks.Remove(task);
    }
    

    【讨论】:

    • 多个问题:1)await可以在async方法中使用。 2)async方法的返回类型可以是voidTaskTask&lt;T&gt;。 ...
    • 然后,您应该查看 Rx 或 IProgress。
    猜你喜欢
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    相关资源
    最近更新 更多