2012-09-02 22 views
0

嘗試更新雲隊列中的郵件時出現異常。更新雲隊列中的郵件內容時出現異常

唯一的例外是:

System.ArgumentNullException was unhandled 
    Message=Value cannot be null. 
Parameter name: messageId 
    Source=Microsoft.WindowsAzure.StorageClient 
    ParamName=messageId 
    StackTrace: 
     at Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.get_Result() 
     at Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.ExecuteAndWait() 
     at Microsoft.WindowsAzure.StorageClient.TaskImplHelper.ExecuteImplWithRetry(Func`1 impl, RetryPolicy policy) 
     at Microsoft.WindowsAzure.StorageClient.CloudQueue.UpdateMessage(CloudQueueMessage message, TimeSpan visibilityTimeout, MessageUpdateFields updateFields) 
     at WorkerRole.WorkerRole.DoTask(Task task) in C:\Users\ALICE\Desktop\Diplloma\AG - Copy\AzureGrid\WorkerRole\WorkerRole.cs:line 133 
     at WorkerRole.WorkerRole.Run() in C:\Users\ALICE\Desktop\Diplloma\AG - Copy\AzureGrid\WorkerRole\WorkerRole.cs:line 51 
     at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.StartRoleInternal() 
     at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.StartRole() 
     at Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleRuntimeBridge.<StartRole>b__1() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

我的代碼是:

private void DoTask(Task task) 
{ 
    CloudQueueMessage resultsMessage; 

    // Queue a status message to indicate this worker is starting the task. 
    task.TaskStatus = Task.Status.Running; 
    task.Worker = System.Net.Dns.GetHostName(); 
    resultsMessage = task.Message; 
    ResultsQueue.UpdateMessage(resultsMessage, TimeSpan.FromSeconds(QueueTimeout), MessageUpdateFields.Content | MessageUpdateFields.Visibility); 


    Trace.WriteLine("Executing task " + task.TaskId.ToString() + " for job " + task.JobId + ", project " + task.ProjectName,"Information"); 

    using (GridWorker gridWorker = new AppWorker()) 
    { 
     gridWorker.Execute(task); 
    } 

    // Queue results. 
    task.TaskStatus = Task.Status.Complete; 
    resultsMessage = task.Message; 
    ResultsQueue.UpdateMessage(resultsMessage, TimeSpan.FromSeconds(QueueTimeout), MessageUpdateFields.Content | MessageUpdateFields.Visibility); 
} 

下面是任務對象被創建

public override void Run() 
{ 
    CloudQueueMessage taskMessage; 
    Task task; 

    // This is a sample worker implementation. Replace with your logic. 
    Trace.WriteLine("Initializing", "Information"); 

    LoadConfigurationSettings(); 
    OpenQueues(); 

    Trace.WriteLine("Initializing", "Ready for work"); 

    // Work loop. Read a task from the queue. If there is a task, execute it and pass work output to the results queue. Loop. 

    while (true) 
    { 
     taskMessage = TaskQueue.GetMessage(TimeSpan.FromSeconds(QueueTimeout)); 
     //taskMessage = TaskQueue.PeekMessage(); 

     if (taskMessage != null) 
     { 
      task = new Task(taskMessage); 
      DoTask(task); 
      TaskQueue.DeleteMessage(taskMessage); 
     } 
     else 
      Thread.Sleep(SleepInterval * 1000); 
    } 
} 

這是我的第一個應用程序,我不不明白該怎麼做。

回答

2

task.Message從哪兒來的?之前是否從隊列中讀取? (它似乎缺少消息ID。)

+0

謝謝你的回答。 task.Message是一個包含一些在字符串中轉換的xml數據的屬性。 – MIlena

+0

好吧,'task.Message'必須是'CloudQueueMessage'類型的對象,對吧?那個'CloudQueueMessage'從哪裏來的?你是否從隊列中檢索它? – smarx

+0

哦,對不起。消息是CouldQueueMessage的類型,但它的目的是存儲一些數據,而這些數據是一些在字符串中轉換的xml數據。 – MIlena