2013-11-28 44 views
1
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); 

Task tasks = PeriodicTaskFactory.Start(() => LongRunningOperation(), intervalInMilliseconds: 1000, synchronous: false, cancelToken: cancellationTokenSource.Token); 

int taskId = Task.WaitAny(tasks); 

和我LongRunningOperation異步任務如何從一個方法

private String LongRunningOperation() 
{ 
... 
return proj.Name; 
} 

返回值回,但問題是如何從LongRunningOperation方法早在Task獲得價值。方法tasks.Results不存在。我想從每個任務中獲得價值。

我從這裏得到PeriodicTaskFactory類

Is there a Task based replacement for System.Threading.Timer?

謝謝

+0

如果'Start'返回了一個'Task',那麼您將無法使用'Task.WaitAny'。我認爲你的意思是'開始'返回'任務[]'。 – dcastro

+0

@dcastro「開始」返回「返回Task.Factory.StartNew(mainAction,cancelToken,TaskCreationOptions.LongRunning,TaskScheduler.Current);」 – senzacionale

+0

然後這行是錯誤的:'int taskId = Task.WaitAny(tasks);'。沒有接受單個任務的'WaitAny'超載。 – dcastro

回答

4

Task沒有返回值; Task<T>呢。

您必須修改PeriodicTaskFactory代碼才能返回Task<T>,然後創建Task<string>對象。 該方法還應該接受Func<T>(沒有參數,返回T)而不是Action,它沒有返回值。

public static Task<T> Start<T>(Func<T> func, 
     int intervalInMilliseconds = Timeout.Infinite, 
     int delayInMilliseconds = 0, 
     int duration = Timeout.Infinite, 
     int maxIterations = -1, 
     bool synchronous = false, 
     CancellationToken cancelToken = new CancellationToken(), 
     TaskCreationOptions periodicTaskCreationOptions = TaskCreationOptions.None) 
    { 


Task<string> task = PeriodicTaskFactory.Start(LongRunningOperation, intervalInMilliseconds: 1000, synchronous: false, cancelToken: cancellationTokenSource.Token); 

string result = task.Result; 
+0

你可以只用信息放回代碼與等待。在StartPeriodicTask – senzacionale

+0

的{...}中應該有什麼對不起,但您必須自己修改'Start'代碼。我給你提供了必要的提示:使用任務而不是任務,而使用功能而不是操作。 – dcastro

+0

好的,我會做的。感謝幫助。 – senzacionale