Share via


DraftProject.Update 方法

在新專案或回復至 Project Server 已取出草稿專案儲存變更。

命名空間:  Microsoft.ProjectServer.Client
組件:  Microsoft.ProjectServer.Client (在 Microsoft.ProjectServer.Client.dll 中)

語法

'宣告
<RemoteAttribute> _
Public Function Update As QueueJob
'用途
Dim instance As DraftProject
Dim returnValue As QueueJob

returnValue = instance.Update()
[RemoteAttribute]
public QueueJob Update()

傳回值

類型:Microsoft.ProjectServer.Client.QueueJob
QueueJob物件,其中包含已排入佇列工作的相關資訊。佇列工作成功時,Project Server 佇列服務會儲存專案的新的或草稿版本。

備註

Update方法無法處理 CSOM 要求大於 2 MB 的大小。如需 CSOM 限制的詳細資訊,請參閱 < What the CSOM does and does not do

範例

下列範例會顯示建立大於 2 MB 的大小 CSOM 要求的問題。此範例會呼叫TestCreateTasks方法兩次,先將 252 工作新增至專案,然後再試 253 工作。在第二個要求的資料數量超過 2 MB,因為要求就會失敗。

TestCreateTasksInGroups方法會實作成較小的群組會自動換行大型要求的其中一個方法。

using System;
using System.Net;
using Microsoft.ProjectServer.Client;
using Microsoft.SharePoint.Client;

namespace LimitTest
{
    internal static class Program
    {
        const int SUCCESS = 0;
        const int ERROR = 1;

        private static void Main()
        {
            using (var context = CreateContext())
            {
                // Create a request of less than 2 MB.
                int numTasks = 252;
                TestCreateTasks(context, numTasks);

                // Create a request that is greater than 2 MB.
                numTasks = 253;
                TestCreateTasks(context, numTasks);

                // Break a large request into groups of less than 2 MB.
                numTasks = 301;
                int groupCount = 200;
                TestCreateTasksInGroups(context, numTasks, groupCount);
            }
            exitApp(SUCCESS);
        }

        private static ProjectContext CreateContext()
        {
            const string url = "https://ServerName/pwa";     // Change the PWA URL.
            var context = new ProjectContext(url);
            return context;
        }

        private static void TestCreateTasks(ProjectContext context, int taskCount)
        {
            PublishedProject project;
            DraftProject projectDraft = null;

            Console.WriteLine("\n*** Creating project for {0} tasks", taskCount);
            var projectInfo = new ProjectCreationInformation();
            projectInfo.Id = Guid.NewGuid();
            projectInfo.Name = "LimitTest_" + taskCount + "_" + DateTime.Now.ToString("yyyyMMdd_HHmmss");
            projectInfo.Start = DateTime.Today;

            project = context.Projects.Add(projectInfo);

            var job = context.Projects.Update();

            if (WaitForJob(context, job))
            {
                projectDraft = project.CheckOut();

                Console.WriteLine("Creating the {0} tasks", taskCount);

                for (var i = 0; i < taskCount; i++)
                {
                    CreateTask(projectDraft.Tasks, i);
                }

                Console.WriteLine("Calling DraftProject.Update for project: {0}", projectInfo.Name);

                job = projectDraft.Update();
            }
            else
            {
                Console.WriteLine("\nThe Update job failed for Projects.Add.");
                exitApp(ERROR);
            }

            Console.WriteLine("\tWaitForJob: after DraftProject:Update");

            if (WaitForJob(context, job))
            {
                Console.WriteLine("\nChecking in and publishing project");
                job = projectDraft.Publish(true);
                Console.WriteLine("\tWaitForJob: after DraftProject.Publish");

                if (!WaitForJob(context, job))
                {
                    Console.WriteLine("\nThe DraftProject.Publish job failed for the project.");
                    exitApp(ERROR);
                }
            }
            else
            {
                Console.WriteLine("\nThe DraftProject.Update job failed for adding {0} tasks.", taskCount);
            }

            Console.WriteLine();
        }

        private static void TestCreateTasksInGroups(ProjectContext context, int taskCount, int groupCount)
        {
            PublishedProject project;
            DraftProject projectDraft = null;
            int numGroups = taskCount / groupCount;
            int remainingTasks = taskCount % groupCount;

            if (remainingTasks > 0) numGroups++;

            var projectInfo = new ProjectCreationInformation();
            projectInfo.Id = Guid.NewGuid();
            projectInfo.Name = "LimitTest_" + taskCount + "_groupCount_" + groupCount 
                + "_" + DateTime.Now.ToString("yyyyMMdd_HHmmss");
            projectInfo.Start = DateTime.Today;
            Console.WriteLine("\n*** Creating project for {0} tasks in groups of {1}:\n\t{2}", 
                taskCount, groupCount, projectInfo.Name);

            project = context.Projects.Add(projectInfo);
            var job = context.Projects.Update();

            if (WaitForJob(context, job))
            {
                int tasks2Create = groupCount;

                projectDraft = project.CheckOut();

                for (int i = 0; i < numGroups; i++)
                {
                    if (i == numGroups - 1) tasks2Create = remainingTasks;

                    Console.WriteLine("\nCreating group {0}: {1} tasks", i, tasks2Create);

                    for (int t = 0; t < tasks2Create; t++)
                    {
                        CreateTask(projectDraft.Tasks, i);
                    }

                    Console.WriteLine("Calling DraftProject.Update for task group: {0}", i);
                    job = projectDraft.Update();

                    if (WaitForJob(context, job))
                    {
                        Console.WriteLine("\n\tSuccess: DraftProject.Update job complete");
                    }
                    else
                    {
                        Console.WriteLine("\nThe DraftProject.Update job failed.");
                        exitApp(ERROR);
                    }
                }
                Console.WriteLine("\nPublishing the project");
                job = projectDraft.Publish(true);

                if (WaitForJob(context, job))
                {
                    Console.WriteLine("\nThe project '{0}'\n\tis published, with {1} tasks.", 
                        projectInfo.Name, taskCount);
                }
                else
                {
                    Console.WriteLine("\nThe DraftProject.Publish job failed.");
                    exitApp(ERROR);
                }
            }
        }

        private static void exitApp(int exitCode)
        {
            Console.Write("Press any key to exit: ");
            Console.ReadKey(true);
            Environment.Exit(exitCode);
        }

        private static void CreateTask(DraftTaskCollection draftTasks, int i)
        {
            var taskInfo = new TaskCreationInformation();
            taskInfo.Id = Guid.NewGuid();
            taskInfo.Name = i.ToString();
            taskInfo.IsManual = false;
            taskInfo.Duration = "1d";

            draftTasks.Add(taskInfo);
        }

        private static bool WaitForJob(ProjectContext context, QueueJob job)
        {
            bool result = true;

            try
            {
                context.WaitForQueue(job, int.MaxValue);
            }
            catch (ServerException ex)
            {
                Console.WriteLine("\n" + ex);
                result = false;
            }
            return result;
        }
    }
}

以下是執行LimitTest範例的輸出:

*** Creating project for 252 tasks
Creating the 252 tasks
Calling DraftProject.Update for project: LimitTest_252_20120530_084023
        WaitForJob: after DraftProject:Update

Checking in and publishing project
        WaitForJob: after DraftProject.Publish


*** Creating project for 253 tasks
Creating the 253 tasks
Calling DraftProject.Update for project: LimitTest_253_20120530_084224
        WaitForJob: after DraftProject:Update

Microsoft.SharePoint.Client.ServerException: The request uses too many resources.
   at Microsoft.SharePoint.Client.ClientRequest.ProcessResponseStream(Stream responseStream)
   at Microsoft.SharePoint.Client.ClientRequest.ProcessResponse()
   at Microsoft.SharePoint.Client.ClientRequest.ExecuteQueryToServer(ChunkStringBuilder sb)
   at Microsoft.SharePoint.Client.ClientRequest.ExecuteQuery()
   at Microsoft.SharePoint.Client.ClientRuntimeContext.ExecuteQuery()
   at Microsoft.SharePoint.Client.ClientContext.ExecuteQuery()
   at Microsoft.ProjectServer.Client.ProjectContext.WaitForQueue(QueueJob job, Int32 timeoutSeconds)
   at LimitTest.Program.WaitForJob(ProjectContext context, QueueJob job) 
      in d:\Project\P15\CSOM\CSOMLimitTest\Program.cs:line 193

The DraftProject.Update job failed for adding 253 tasks.


*** Creating project for 301 tasks in groups of 200: 
        LimitTest_301_groupCount_200_20120530_085506

Creating group 0: 200 tasks
Calling DraftProject.Update for task group: 0

        Success: DraftProject.Update job complete

Creating group 1: 101 tasks
Calling DraftProject.Update for task group: 1

        Success: DraftProject.Update job complete

Publishing the project

The project 'LimitTest_301_groupCount_200_20120530_085506' 
        is published, with 301 tasks.

Press any key to exit:

請參閱

參照

DraftProject 類別

DraftProject 成員

Microsoft.ProjectServer.Client 命名空間