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
(例如,操作
),我试试这个:)