문제 발생

SCVMM 에서 Install Virtual Guest Services(가상 게스트 서비스 설치) 작업 시 2941 오류가 나는 경우가 발생 합니다..

해결 방법 1

이 문제는 HTTP 통신 (80, 443 포트) 가 방화벽으로 제한된 경우에 발생합니다.
본 문제로 아래의 URL 을 통해 문제가 해결되지 않는 경우가 발생합니다.
http://srvcore.wordpress.com/2010/04/11/error-2941-when-moving-vms-accross-hyper-v-servers/

해결 방법 2

이 문제를 해결하기 위해 여러 가지 방법을 수행해 보았으나, 아래의 작업으로 해결되지 않았습니다.

  • 가상 네트워크 삭제 및 재설정
  • 네트워크 위치(Network Location) 삭제 및 재설정

아무리 생각해 봐도, 방화벽, WS-Management 서비스 및 네트워크 문제가 발생할 소지가 없음에도, 제대로 기능이 실행되지 않았습니다.

이 경우 Active Directory 기반의 호스트를 제거한 후, 다시 호스트를 추가하고, 다시 Install Virtual Guest Services(가상 게스트 서비스 설치) 작업을 시작합니다.

아래와 같이 올바르게 작업이 진행된다.

   

Welcome to Parallel C#(8) - 취소 쉽게 하기.

C# Parallel Programming 2010. 6. 17. 09:00 Posted by 알 수 없는 사용자

- 취소는 어렵지.

약속은 하는 것 보다, 취소하는 게 어렵습니다. 게다가 취소할 때는 적절한 타이밍을 놓치면, 안 좋은 기억만 남기게 되죠. 그래서 프로그램에서도 취소를 제대로 할 수 있도록 지원하는 게 중요합니다. 누구나 실수 할 수 있거든요.


- TPL과 함께 취소 좀 더 쉽게하기. 어헣.

TPL은 두가지 형태의 병렬성을 지원합니다. 첫 번째는 작업 병렬성(Task Parallel)이고, 두 번째는 데이터 병렬성(Data Parallelism)입니다. 작업 병렬성은 하나 이상의 작업이 동시에 진행되는 것을 말하구요, 데이터 병렬성은 연속적인 데이터에 대해서 동일한 작업이 동시적으로 수행되는 것을 말합니다. 기존까지 Task클래스와 관련해서 살펴봤던게 작업 병렬성을 위한 것이었다면, 이번에는 데이터 병렬성을 지원하는 부분을 살펴보겠습니다.

데이터 병렬성을 매우 손쉽게 지원하기 위해서 System.Threading.Tasks.Parallel클래스에 병렬성을 지원하는 for와 foreach를 추가했습니다. Parallel.For와 Parallel.ForEach가 바로 그 것인데요. 하나씩 살펴보겠습니다.

using System;
using System.Linq;
using System.Threading.Tasks;

namespace Exam13
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] nums = Enumerable.Range(1, 1000).ToArray<int>();
            Parallel.For(0, 1000, (i) =>
            {
                nums[i] = nums[i] * nums[i];
            });

            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(nums[i].ToString());               
            }
        }
    }
}

<코드1> 간단한 병렬 예제.

<코드1>을 보면, 1부터 1000까지의 정수 배열을 만든 뒤에, 각각의 수를 제곱하는 코드입니다. i번째의 숫자를 제곱해서 그 결과를 i번째 인덱스에 넣는 작업과, i+1번째의 숫자를 제곱해서 그 결과를 i+1번째 인덱스에 넣는 작업은 별개의 작업이며, 동시에 수행가능한 작업이죠. 저렇게 for와 거의 비슷한 모양으로 작성하고, for대신에 Parallel.For를 써주는 것 만으로도 남아도는 CPU의 코어를 활용할 수 있다니. 간편하죠?

Parallel.ForEach와 병렬 루프에서 예외를 처리하는 부분은 이미 다룬 부분이기 때문에 건너뛰구영. 바로, 병렬 루프를 취소하는 방법에 대해서 알아보겠습니다. 지난 포스트에서 작업을 취소하는 방법에 대해서 알아봤었는데요. 이번에도 크게 다르지 않습니다. 동일하게 CancellationTokenSource와 CancellationToken클래스를 활용합니다. 다만, 방법이 약간 다른데요, 예제를 보시죠.

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Threading.Tasks;
using System.Threading;

namespace Exam14
{
    class Program
    {
        static void Main(string[] args)
        {
            CancellationTokenSource cts =
                new CancellationTokenSource();
            ParallelOptions parallelOptions =
                new ParallelOptions
                {
                    CancellationToken = cts.Token
                };
            cts.Token.Register(
                () => Console.WriteLine("Cancelling....")
            );

            Console.WriteLine("끝내려면 엔터키를 누르세용.");

            IEnumerable<string> files =
                Directory.GetFiles("C:\\음악", "*", SearchOption.AllDirectories);
            List<string> fileList = new List<string>();

            Console.WriteLine("파일 개수 : {0}", files.Count());

            Task task = Task.Factory.StartNew(() =>
                {
                    try
                 {
                        Parallel.ForEach(files, parallelOptions,
                        (file) =>
                        {
                            FileInfo fileInfo = new FileInfo(file);
                            if (fileInfo.Exists)
                            {
                                if (fileInfo.Length >= 10000000)
                                {
                                    fileList.Add(fileInfo.Name);
                                }
                            }
                        });
                 }
                 catch (OperationCanceledException)
                 {
                 }
                });

            Console.Read();

            cts.Cancel();
            task.Wait();
           
            foreach (var file in fileList)
            {
                Console.WriteLine(file);
            }
            Console.WriteLine("총 파일 개수 : {0}",fileList.Count());
        }
    }
}

<코드2> 병렬 루프에서의 작업 취소.

<코드2>를 보면, Parallel.ForEach이용해서, 음악 파일 중에서 10메가가 넘는 파일만 찾아서 리스트에 담고 있습니다. 그리고 루프 취소와 모니터링을 위해서 CancellationTokenSource, CancellationToken클래스를 활용하고 있습니다. 다른점이 있다면, 병렬 루프에 옵션을 주기 위해서 ParallelOptions클래스를 사용하고 있다는 것이죠. 그리고 생성된 ParallelOptions타입의 객체에 Token을 주고, 그 객체를 Parallel.ForEach루프에 매개변수로 넘겨주고 있습니다. 결과를 보면, 늦게 취소를 한 경우에는 리스트가 모두 완성된 반면에, 빨리 취소를 한 경우에는 리스트가 만들어지다가 만 걸 확인할 수 있죠.

끝내려면 엔터키를 누르세용.
파일 개수 : 2746

Cancelling....

(중략...)

05 サンクチュアリ.mp3
06 空のように 海のように.mp3
07 月の虹.mp3
총 파일 개수 : 380
계속하려면 아무 키나 누르십시오 . . .

<결과1> 늦게 취소해서 다 완성된 리스트.

끝내려면 엔터키를 누르세용.
파일 개수 : 2746

Cancelling....

(중략...)

01.mp3
02.mp3
03.mp3
01.うるわしきひと.mp3
총 파일 개수 : 256
계속하려면 아무 키나 누르십시오 . . .

<결과2> 중간에 취소해서 만들어지다 만 리스트.

ParallelOptions를 통해서 CancellationToken을 받은 병렬 루프는 내부적으로, IsCancellationRequested속성을 계속해서 주시하고 있습니다. 그리고, 이 취소 요청이 들어와서 이 속성이 true가 되면, 그 이후로는 새로운 루프가 시작되는 걸 막아버리는 것이죠. 그리고 병렬 루프가 취소되었음을 외부에 알릴 수 있는 유일한 방법이 OperationCanceledException을 통해서 인데요. <코드2>를 보면, catch를 통해서 예외를 잡긴하지만, 무시해버렸습니다. 그래서 Register메서드를 통해서 등록된 "Cancelling...."이라는 메세지가 출력되고 프로그램이 종료된 것이죠.


- 마치면서

역시 병렬처리를 간단하게 만들어 주는 만큼, 병렬처리를 취소하는 방법도 최대한 간단하게 만들어 주네요. TPL만쉐이! 어헣.


- 참고자료

1. Essential C# 4.0, Mark Michaelis, Addison Wesley
2. http://msdn.microsoft.com/en-us/library/dd537608.aspx
3. http://msdn.microsoft.com/en-us/library/dd537609.aspx

Visual Studio 2010 이 출시된 이후 짧은 시간 동안 많은 변화가 있었습니다. 그리고 그 변화의 움직임을 직접 느끼고 있고요. 많은 기업과 고객, 그리고 여러분들께서 보여주신 관심은 기대 이상이었습니다. 

이에 질세라 저희 Visual Studio 2010 공식 팀에서 여러분들을 위해 많은 문서를 무료로 만들어 배포하고 있습니다.

   

   

아래의 링크에서 방대한 양의 문서를 PDF 로 무료로 다운로드하실 수 있습니다.
http://msdn.microsoft.com/ko-kr/vstudio/default.aspx

   

Visual Studio 2010

Visual Studio 2010 필요한 10가지 이유-라인업 기능소개 브로셔
Visual Studio 2010 UPGRADE NOW 프로모션 브로셔
Visual Studio 2010 라이센스 가이드
Visual Studio 2010 활용한 ALM 백서 (.NETXPERT 재직 중 엄준일 저)

Team Foundation Server 2010

Team Foundation Server 2010 설치 가이드 (다중서버) (.NETXPERT 재직 중 엄준일 저)
Team Foundation Server 2010 활용가이드 (FQDN) (.NETXPERT 재직 중 엄준일 저)
Team Foundation Server 2010 설치 가이드 (단일서버) (.NETXPERT 재직 중 엄준일 저)
Team Foundation Server 2010 설치 가이드 (Lab 환경구성) (.NETXPERT 재직 중 엄준일 저)

Language

First Look C#4.0 백서 (강보람 저)
Visual Studio 2010 C++0x 백서 (최흥배 저)

Visual Studio 2010 단축키

Visual Studio 2010 Visual Basic 단축키 포스터 (방수철님 역)
Visual Studio 2010 Visual F# 단축키 포스터 (방수철님 역)
Visual Studio 2010 Visual C++ 단축키 포스터 (방수철님 역)
Visual Studio 2010 Visual C# 단축키 포스터 (방수철님 역)