Share via


ProjectContext.WaitForQueue - Méthode

Attend que la tâche de file d'attente spécifiée à terminer, ou pour un nombre maximal de secondes.

Espace de noms :  Microsoft.ProjectServer.Client
Assembly :  Microsoft.ProjectServer.Client (dans Microsoft.ProjectServer.Client.dll)

Syntaxe

'Déclaration
Public Function WaitForQueue ( _
    job As QueueJob, _
    timeoutSeconds As Integer _
) As JobState
'Utilisation
Dim instance As ProjectContext
Dim job As QueueJob
Dim timeoutSeconds As Integer
Dim returnValue As JobState

returnValue = instance.WaitForQueue(job, _
    timeoutSeconds)
public JobState WaitForQueue(
    QueueJob job,
    int timeoutSeconds
)

Paramètres

  • timeoutSeconds
    Type : System.Int32

    Le nombre maximal de secondes à attendre pour la fin du travail de file d'attente.

Valeur renvoyée

Type : Microsoft.ProjectServer.Client.JobState
L'état de la tâche de file d'attente. Si la tâche se termine correctement, renvoie la valeur JobState.Success.

Exemples

L'exemple de Console nommé QueueCreateProject effectue les tâches suivantes :

  • Analyse la ligne de commande pour obtenir le nom d'un nouveau projet et un délai d'attente de travail facultatif de file d'attente. Le délai d'attente par défaut est de 10 secondes. Par exemple, si un projet nommé projet Test 1 n'existe pas dans Project Web App, vous pouvez exécuter l'application avec la commande QueueCreateProject -projName "Test proj 1" .

  • Crée un objet ProjectContext pour l'instance spécifiée de Project Web App .

  • Obtient le GUID du type de projet entreprise (EPTER) nommé « Plan de projet de base ».

  • Crée un projet à l'aide de la méthode CreateTestProject , qui définit les propriétés d'un objet ProjectCreationInformation .

  • Attend que le Service de file d'attente de Project Server publier le nouveau projet, à l'aide de la méthode ProjectContext.WaitForQueue .

  • Répertorie les projets publiés. Si l'application QueueCreateProject n'appelle pas la méthode WaitForQueue , les projets publiés incluent ne peut-être pas encore le nouveau projet.

Pour plus d'informations sur cet exemple, consultez Getting started with the Project Server CSOM and .NET.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.ProjectServer.Client;

namespace QueueCreateProject
{
    class Program
    {
        private const string pwaPath = "https://ServerName/pwa/"; // Change the path to Project Web App.
        private static string basicEpt = "Basic Project Plan";   // Basic enterprise project type.
        private static string projName = string.Empty;
        private static int timeoutSeconds = 10;  // The maximum wait time for a queue job, in seconds.

        private static ProjectContext projContext;

        static void Main(string[] args)
        {
            if (!ParseCommandLine(args))
            {
                Usage();
                ExitApp();
            }

            projContext = new ProjectContext(pwaPath);

            if (CreateTestProject())
                ListPublishedProjects();
            else
                Console.WriteLine("\nProject creation failed: {0}", projName);

            ExitApp();
        }

        // Create a project.
        private static bool CreateTestProject()
        {
            bool projCreated = false;

            try
            {
                Console.Write("\nCreating project: {0} ...", projName);
                ProjectCreationInformation newProj = new ProjectCreationInformation();

                newProj.Id = Guid.NewGuid();
                newProj.Name = projName;
                newProj.Description = "Test creating a project with CSOM";
                newProj.Start = DateTime.Today.Date;

                // Setting the EPT GUID is optional. If no EPT is specified, Project Server uses 
                // the default EPT. 
                newProj.EnterpriseProjectTypeId = GetEptUid(basicEpt);

                PublishedProject newPublishedProj = projContext.Projects.Add(newProj);
                QueueJob qJob = projContext.Projects.Update();

                // Calling Load and ExecuteQuery for the queue job is optional. If qJob is 
                // not initialized when you call WaitForQueue, Project Server initializes it.
                // projContext.Load(qJob);
                // projContext.ExecuteQuery();

                JobState jobState = projContext.WaitForQueue(qJob, timeoutSeconds);

                if (jobState == JobState.Success)
                {
                    projCreated = true;
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.WriteLine("\nThere is a problem in the queue. Timeout is {0} seconds.", 
                        timeoutSeconds);
                    Console.WriteLine("\tQueue JobState: {0}", jobState.ToString());
                    Console.ResetColor();
                }

                Console.WriteLine();
            }
            catch(Exception ex)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("\nError: {0}", ex.Message);
                Console.ResetColor();
            }
            return projCreated;
        }

        // Get the GUID of the specified enterprise project type.
        private static Guid GetEptUid(string eptName)
        {
            Guid eptUid = Guid.Empty;

            try
            {
                // Get the list of EPTs that have the specified name. 
                // If the EPT name exists, the list will contain only one EPT.
                var eptList = projContext.LoadQuery(
                    projContext.EnterpriseProjectTypes.Where(
                        ept => ept.Name == eptName));
                projContext.ExecuteQuery();

                eptUid = eptList.First().Id;

                // Alternate routines to find the EPT GUID. Both (a) and (b) download the entire list of EPTs.
                // (a) Using a foreach block:
                //foreach (EnterpriseProjectType ept in projSvr.EnterpriseProjectTypes)
                //{
                //    if (ept.Name == eptName)
                //    {
                //        eptUid = ept.Id;
                //        break;
                //    }
                //}
                // (b) Querying for the EPT list, and then using a lambda expression to select the EPT:
                //var eptList = projContext.LoadQuery(projContext.EnterpriseProjectTypes);
                //projContext.ExecuteQuery();
                //eptUid = eptList.First(ept => ept.Name == eptName).Id;
            }
            catch (Exception ex)
            {
                string msg = string.Format("GetEptUid: eptName = \"{0}\"\n\n{1}",
                    eptName, ex.GetBaseException().ToString());
                throw new ArgumentException(msg);
            }
            return eptUid;
        }

        // List the published projects.
        private static void ListPublishedProjects()
        {
            // Get the list of projects on the server.
            projContext.Load(projContext.Projects);
            projContext.ExecuteQuery();

            Console.WriteLine("\nProject ID : Project name : Created date");

            foreach (PublishedProject pubProj in projContext.Projects)
            {
                Console.WriteLine("\n\t{0} :\n\t{1} : {2}", pubProj.Id.ToString(), pubProj.Name,
                    pubProj.CreatedDate.ToString());
            }
        }

        // Parse the command line. Return true if there are no errors.
        private static bool ParseCommandLine(string[] args)
        {
            bool error = false;
            int argsLen = args.Length;

            try
            {
                for (int i = 0; i < argsLen; i++)
                {
                    if (error) break;
                    if (args[i].StartsWith("-") || args[i].StartsWith("/"))
                        args[i] = "*" + args[i].Substring(1).ToLower();

                    switch (args[i])
                    {
                        case "*projname":
                        case "*n":
                            if (++i >= argsLen) return false;
                            projName = args[i];
                            break;
                        case "*timeout":
                        case "*t":
                            if (++i >= argsLen) return false;
                            timeoutSeconds = Convert.ToInt32(args[i]);
                            break;
                        case "*?":
                        default:
                            error = true;
                            break;
                    }
                }
            }
            catch (FormatException)
            {
                error = true;
            }
            if (string.IsNullOrEmpty(projName)) error = true;
            return !error;
        }

        private static void Usage()
        {
            string example = "Usage: QueueCreateProject -projName | -n \"New project name\" [-timeout | -t sec]";
            example += "\nExample: QueueCreateProject -n \"My new project\"";
            example += "\nDefault timeout seconds = " + timeoutSeconds.ToString();
            Console.WriteLine(example);
        }

        private static void ExitApp()
        {
            Console.Write("\nPress any key to exit... ");
            Console.ReadKey(true);
            Environment.Exit(0);
        }
    }
}

Voir aussi

Référence

ProjectContext classe

ProjectContext - Membres

Microsoft.ProjectServer.Client - Espace de noms