【发布时间】:2014-11-05 14:29:26
【问题描述】:
我在 WPF 中有一个生产者-消费者应用程序。在我点击一个按钮之后。
private async void Start_Click(object sender, RoutedEventArgs e)
{
try
{
// set up data
var producer = Producer();
var consumer = Consumer();
await Task.WhenAll(producer, consumer);
// need log the results in Summary method
Summary();
}
}
summary 方法是无效的;我认为这是正确的。
private void Summary(){}
async Task Producer(){ await something }
async Task Consumer(){ await something }
编辑:
我的问题是在Summary() 方法中,我必须使用任务中的计算值,但是Consumer 任务是一个长期运行的过程。程序运行Summary 很快,即使没有得到更新的值。它使用初始值。
我的想法:
await Task.WhenAll(producer, consumer);
Summary();
EDIT2:2014 年 11 月 5 日上午 11:08
private void Summary()
{
myFail = 100 - mySuccess;
_dataContext.MyFail = myFail; // update window upon property changed
async Task Consumer()
{
try
{
Dictionary<string, string> dict = new Dictionary<string, string>();
var executionDataflowBlockOptions = new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = 5,
CancellationToken = cToken
};
var c = new ActionBlock<T>(
t=>
{
if (cToken.IsCancellationRequested)
return;
dict = Do(t, cToken);
if(dict["Success"] == "Success")
mySuccess++;
目前的问题是mySuccess始终是Summary方法中的初始值。
【问题讨论】:
-
我没看懂这个问题...你想在两个任务都完成后调用
Summary方法吗? -
“添加摘要”是什么意思。你的问题很模糊。
-
该代码有效吗?如果不是,您期望什么,您观察到什么,对差异有什么想法?这就是准确地在其他两个任务完成后调用方法的方式。你还想要什么?
-
完成需要多长时间与您的问题正交。你问如何“添加摘要()”[原文如此]在完成生产者和消费者之后。您能退后一步,了解我们对您的问题一丁点儿都不了解并更好地解释一下吗?
-
只有在两者都完成后才应该调用
Summary方法。这不是正在发生的事情吗?您是否尝试过调试、在对 Summary 的调用中添加断点并验证它是否运行得太早?另外,这是您程序中的复制代码,对吧?以免我们突然发现您忘记使用await Task.WhenAll,而只有Task.WhenAll。