C# 任务完成时分配属性

C# 任务完成时分配属性,c#,wpf,multithreading,task-parallel-library,C#,Wpf,Multithreading,Task Parallel Library,我想问你:我有代码: var task1 = await _connectionService.ValidateUriAsync(uri1); OutputResult("ss", task1); var task2 = await _connectionService.ValidateUriAsync(uri2); OutputResult("bb", task2); var task3 = await _connectionSe

我想问你:我有代码:

var task1 = await _connectionService.ValidateUriAsync(uri1);
        OutputResult("ss", task1);
        var task2 = await _connectionService.ValidateUriAsync(uri2);
        OutputResult("bb", task2);
        var task3 = await _connectionService.ValidateUriAsync(uri3);
        OutputResult("cc", task3);
现在我在等待每个任务完成,然后输出结果。但是我想独立地运行所有任务(我知道怎么做)。但我不知道的是,当某个任务完成时,我需要输出每个任务的结果。如果任务失败,则输出将为-task1失败或task1成功。 我尝试了这个解决方案,但我必须检查哪个任务已完成,以及它的结果(真/假)。这是复杂的。如果我有100个任务,我就不能有100个条件

var tasks = new[] {task1, task2, task3};

        var process = tasks.Select(async task =>
        {
            var result = await task;
            if(task == task1)assign property

        });

        await Task.WhenAll(proces);
编辑: 以下是ValidateEuriaSync func:

public async Task<bool> ValidateUriAsync(Uri uri)
    {
        try
        {
            var request = WebRequest.CreateHttp(uri);
            var result = await request.GetResponseAsync();
            return true;
        }
        catch (Exception e)
        {
            return false;
        }
    }
公共异步任务ValidateUriAsync(Uri)
{
尝试
{
var-request=WebRequest.CreateHttp(uri);
var result=wait request.GetResponseAsync();
返回true;
}
捕获(例外e)
{
返回false;
}
}
当一些任务完成时,我需要输出每个任务的结果

不要用“完成任务时对其作出反应”来考虑这一点。相反,将您的
ValidateUriAsync
方法视为一个“操作”,您需要创建一个新的更高级别的“操作”,即“验证和分配”

有了这种心态,解决方案就更清晰了——为新操作引入一种新的
async
方法:

private async Task ValidateAndOutputResult(Uri uri, string name)
{
  var result = await _connectionService.ValidateUriAsync(uri);
  OutputResult(name, result);
}
现在您可以调用更高级别的方法,并使用
Task。whalll

var tasks = new[]
{
  ValidateAndOutputResult(uri1, "ss"),
  ValidateAndOutputResult(uri2, "bb"),
  ValidateAndOutputResult(uri3, "cc"),
};
await Task.WhenAll(tasks);
当一些任务完成时,我需要输出每个任务的结果

不要用“完成任务时对其作出反应”来考虑这一点。相反,将您的
ValidateUriAsync
方法视为一个“操作”,您需要创建一个新的更高级别的“操作”,即“验证和分配”

有了这种心态,解决方案就更清晰了——为新操作引入一种新的
async
方法:

private async Task ValidateAndOutputResult(Uri uri, string name)
{
  var result = await _connectionService.ValidateUriAsync(uri);
  OutputResult(name, result);
}
现在您可以调用更高级别的方法,并使用
Task。whalll

var tasks = new[]
{
  ValidateAndOutputResult(uri1, "ss"),
  ValidateAndOutputResult(uri2, "bb"),
  ValidateAndOutputResult(uri3, "cc"),
};
await Task.WhenAll(tasks);

所有任务的结果是否为同一类型?是。ValidateUriAsync返回true/false。您能否展示一些今天如何创建任务的摘录(我猜您没有100行代码执行
var task\n=wait\u co…Async(uri\u n)
)?您能否提供一些有关您试图设置的属性的更多信息。。为了配合每个任务,我添加了ValidateEuriAsync函数。所有任务的结果都是相同类型的吗?是的。ValidateUriAsync返回true/false。您能否展示一些今天如何创建任务的摘录(我猜您没有100行代码执行
var task\n=wait\u co…Async(uri\u n)
)?您能否提供一些有关您试图设置的属性的更多信息。。为了完成每项任务,我添加了ValidateEuriaSync功能。谢谢您的回答。是的,这是一个选择。但是,如果我需要将结果绑定到属性,而不是UI上显示的值,该怎么办?我正在考虑在ValidateUriAsync方法中使用ref参数,但是wait/async不允许使用ref/out参数。如果您的意思是每个URI都有一个单独的属性,那么您可以将委托传递给更新相应属性的
ValidateAndOutputResult
(例如,
操作
),我试试这个:)谢谢你的回答。是的,这是一个选择。但是,如果我需要将结果绑定到属性,而不是UI上显示的值,该怎么办?我正在考虑在ValidateUriAsync方法中使用ref参数,但是wait/async不允许使用ref/out参数。如果您的意思是每个URI都有一个单独的属性,那么您可以将委托传递给更新相应属性的
ValidateAndOutputResult
(例如,
操作
),我试试这个:)