1. 비동기 -> 동기화 해결 문제  - 부분 해결

   이슈 iss2 : 현재 Lock으로 동기화 해결을 했는데 -> Queue 방식으로 바꾸면 더 정확히 순차적으로 처리 가능.

2. OnConnected , OnReConnected, OnDisConnected 각 이벤트 별로 로직 완성  - 해결

3. 라이센스가 풀일 경우, 라이센스 재시도 프로세스  - 해결

DB에서 필드 속성을 varchar(100) 정도로 했었는데, 한글 저장시 '???' 나온다 nvarchar(100) 

nvarchar는 가변 길이(nvarchar) 유니코드 데이터(2byte) 라고 하니 , varchar는 가변 길이 문자열 정보 (1byte)

4. 연결 시간이 라이센스 초과 시 라이센스 생성 프로세스 - 부분 해결

   Timer로 10초 간격으로 실행시켜서 1~2분 정도 라이센스가 남은 것 중, 연결중인 사용자의 라이센스를 늘려주도록 하였는데 Store Procedure 로 시간 간격이 1~2분인걸 계산해서 리스트를 가져왔다.

   이슈 iss3 : Timer 말고, 라이센스 만료 시간을 줘서 해당 시간이 되었을 때, 클라이언트가 라이센스 갱신하라는 메서드를 서버에 보내면 어떨까?

5. WCF를 이용하여 Hub의 함수 호출 사용 - 사용자 Kick  - 해결

---------------------------------------------------------------------------------------------------------

Azure에 Hosting 을 했더니 DateTime.Now 해당 시간이 UTC(세계협정시)로 바뀌었다.

호스팅을 동아시아로 했는데도 불구.. 아무튼 알아두자.


해결 - 완전 해결

부분 해결 - 해결 되었으나 다른 로직을 썼을 경우 신뢰도 증가할 수 있는 여부가 있는 부분



'.NET 개발 > SignalR' 카테고리의 다른 글

연결이 끊겼을 경우의 상황을 다 알아보기.  (0) 2015.10.21
2015-10-14 이슈 현황  (0) 2015.10.14
Azure에 SignalR 배포  (0) 2015.07.20
Posted by Hoya0415
,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Program
    {
        static void Main(string[] args)
        {
            const int Repetitations = 10000;
 
            //닷넷 4.5 전에 TPL에서는 
            //Task.Factory.StartNew<string>() 를 이용한다.
            Task task = Task.Run(() =>
            {
                for (int count = 0; count < Repetitations; count++)
                {
                    Console.Write('-');
                }
 
            });
 
            for (int i = 0; i < Repetitations; i++)
            {
                Console.Write('+');
            }
 
            // 작업이 끝나기를 기다린다.
            task.Wait();
        }
    }
cs

비동기 패턴, Task 클래스를 이용하며 Task가 끝나기를 기다리기 위해 Wait 함수를 이용.

비동기가 시작되는 상황을 'Hot' 하다고 하고 비동기가 진행되지 않은 상황을 Cold 하다고 한다.

'.NET 개발 > C#' 카테고리의 다른 글

EntityFramework 활용하기.  (0) 2015.11.09
인터페이스 사용 이유  (0) 2015.10.27
Task<T> Class  (0) 2015.08.10
Task Class 비동기  (0) 2015.08.10
Thread Class  (0) 2015.07.31
Posted by Hoya0415
,

Task<T> Class

.NET 개발/C# 2015. 8. 10. 13:20
C# Task<T> 클래스 

Non-Generic 타입인 Task 클래스는 ThreadPool.QueueUserWorkItem()과 같이 리턴값을 쉽게 돌려 받지 못한다. 비동기 델리게이트(Asynchronous Delegate)와 같이 리턴값을 돌려 받기 위해서는 Task<T> 클래스를 사용한다. Task<T> 클래스의 T는 리턴 타입을 가리키는 것으로 리턴값은 Task객체 생성 후 Result 속성을 참조해서 얻게 된다. Result 속성을 참조할 때 만약 작업 쓰레드가 계속 실행 중이면, 결과가 나올 때까지 해당 쓰레드를 기다리게 된다. 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static void Main(string[] args)
        {
            // Task<T>를 이용하여 쓰레드 생성과 시작
            Task<int> task = Task.Factory.StartNew<int>(() => CalcSize("Hello World"));
 
            // 메인쓰레드에서 다른 작업 실행
            Thread.Sleep(1000);
 
            // 쓰레드 결과 리턴. 쓰레드가 계속 실행중이면
            // 이곳에서 끝날 때까지 대기함
            int result = task.Result;
 
            Console.WriteLine("Result={0}", result);
        }
 
        static int CalcSize(string data)
        {
            string s = data == null ? "" : data.ToString();
            // 복잡한 계산 가정
 
            return s.Length;
        }
cs


'.NET 개발 > C#' 카테고리의 다른 글

인터페이스 사용 이유  (0) 2015.10.27
18.3 비동기 태스크 호출  (0) 2015.09.14
Task Class 비동기  (0) 2015.08.10
Thread Class  (0) 2015.07.31
.Net Remoting  (0) 2015.07.30
Posted by Hoya0415
,

Task 클래스

Task 클래스와 이의 Generic형태인 Task<T>클래스는 .NET 4.0에 도입된 새로운 클래스들로서 쓰레드풀로부터 쓰레드를 가져와 비동기 작업을 실행한다. Task 관련 클래스들과 Parallel 클래스들을 합쳐 Task Parallel Library(TPL)이라 부르는데, 이들은 기본적으로 다중 CPU 병렬 처리를 염두에 두고 만들었다. Task 클래스는 .NET 4.0 이전 버전의 ThreadPool.QueueUserWorkItem()와 같은 기능을 제공하지만, 보다 빠르고 유연한 기능을 갖추고 있다.


방법 1

TaskFactroy.StartNew : Task를 만들고 시작합니다.  스레드 생성과 시작 동시에 

1
2
3
4
5
6
7
8
9
static void Main(string[] args)
        {
            // Task.Factory를 이용하여 쓰레드 생성과 시작
            Task.Factory.StartNew(new Action<object>(Run), null);
            Task.Factory.StartNew(new Action<object>(Run), "1st");
            Task.Factory.StartNew(Run, "2nd");
 
            Console.Read();
        }
cs

방법 2

Task 객체 만들고 Start() -> Wait();

Task 객체로부터 실제 쓰레드를 시작하기 위해서는 Start() 메서드를 호출하고, 종료때까지 기다리기 위해선 Wait() 메서드를 호출한다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
static void Main(string[] args)
        {
            // Task 생성자에 Run을 지정 Task 객체 생성
            Task t1 = new Task(new Action(Run));
 
            // 람다식을 이용 Task객체 생성
            Task t2 = new Task(() =>
            {
                Console.WriteLine("Long query");
            });
 
            // Task 쓰레드 시작
            t1.Start();
            t2.Start();
 
            // Task가 끝날 때까지 대기
            t1.Wait();
            t2.Wait();            
        }
 
        static void Run()
        {            
            Console.WriteLine("Long running method");
        }
cs


'.NET 개발 > C#' 카테고리의 다른 글

18.3 비동기 태스크 호출  (0) 2015.09.14
Task<T> Class  (0) 2015.08.10
Thread Class  (0) 2015.07.31
.Net Remoting  (0) 2015.07.30
Laze 클래스 란?  (0) 2015.07.21
Posted by Hoya0415
,

Thread Class

.NET 개발/C# 2015. 7. 31. 17:40

Thread 란? 하나의 프로세스

여러개의 프로세스가 모여서 하나의 프로그램으로 만들어진다. 

메인 스레드 위에서, 각각 기능을 만든다면 메인 스레드는 가만히 있어도 다른 스레드에서 처리하기 떄문에 

메인 스레드 자기 본연에 일에 충실할 수 있다. 

만약에 파일 전송 기능을 메인 스레드가 하고 있다면, 다른 일을 하지 못하고 계속 멈춰있을 것이다. 

마이크로스프트에 엑셀 프로그램만 봐도, 기능이 많은데 그 기능을 모드 메인 스레드가 한다면... 

작업이 오래걸릴 때 가만히 있을수밖에..

스레드를 잘 사용하기만 하면 ^^ 고수가 될지도. 아래는 예제므로 한 번 해보면 알듯하당^^

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static void Main(string[] args)
        {
            // 파라미터 없는 ThreadStart 사용
            Thread t1 = new Thread(new ThreadStart(Run));
            t1.Start();
 
            // ParameterizedThreadStart 파라미터 전달
            // Start()의 파라미터로 radius 전달
            Thread t2 = new Thread(new ParameterizedThreadStart(Calc));
            t2.Start(10.00);
 
            // ThreadStart에서 파라미터 전달
            Thread t3 = new Thread(() => Sum(102030));
            t3.Start();
        }
cs

ThreadSample.zip


'.NET 개발 > C#' 카테고리의 다른 글

Task<T> Class  (0) 2015.08.10
Task Class 비동기  (0) 2015.08.10
.Net Remoting  (0) 2015.07.30
Laze 클래스 란?  (0) 2015.07.21
Inversion of Control(IOC), Dependency Injection(DI)  (0) 2015.07.13
Posted by Hoya0415
,

.Net Remoting

.NET 개발/C# 2015. 7. 30. 09:28

.Net에서 프로그램 혹은 프로세스같의 통신 방법

WebService와 유사하나 통신 방법에 차이가 있고, 각 특징이 있음

RemotingNet.zip


'.NET 개발 > C#' 카테고리의 다른 글

Task<T> Class  (0) 2015.08.10
Task Class 비동기  (0) 2015.08.10
Thread Class  (0) 2015.07.31
Laze 클래스 란?  (0) 2015.07.21
Inversion of Control(IOC), Dependency Injection(DI)  (0) 2015.07.13
Posted by Hoya0415
,

Laze 클래스 란?

.NET 개발/C# 2015. 7. 21. 16:58

Laze는 초기화를 나중에 미룰 때 한다 .


여러 곳에서 Laze 객체에 접근할 수 있기 때문에 


직접 안전한 Thread 접근을 위해 Lock 이나 volatile, boolean 을 같이 사용하여 안전한 접근을 만들어줘야한다.


예제를 보면 정확히 알 수 있는데 아래에 Lazy<Test> lazy = new Lazy<Test>(); 객체 생성 구문에서 Test는 생성되지 않는다. 


laze.Value를 호출함으로써 Test가 생성되고 추가적으로 객체 생성 구문에 클래스의 초기값을 설정할 수도있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Program
    {
        static void Main(string[] args)
        {
            // Create Lazy.
            Lazy<Test> lazy = new Lazy<Test>();
 
            // Show that IsValueCreated is false.
            Console.WriteLine("IsValueCreated = {0}", lazy.IsValueCreated);
 
            // Get the Value.
            // ... This executes Test().
            Test test = lazy.Value;
 
            // Show the IsValueCreated is true.
            Console.WriteLine("IsValueCreated = {0}", lazy.IsValueCreated);
 
            // The object can be used.
            Console.WriteLine("Length = {0}", test.Length);
        }
 
        class Test
        {
            int[] _array;
            public Test()
            {
                Console.WriteLine("Test()");
                _array = new int[10];
            }
            public int Length
            {
                get
                {
                    return _array.Length;
                }
            }
        }
    }
cs

LazySample.zip


'.NET 개발 > C#' 카테고리의 다른 글

Task<T> Class  (0) 2015.08.10
Task Class 비동기  (0) 2015.08.10
Thread Class  (0) 2015.07.31
.Net Remoting  (0) 2015.07.30
Inversion of Control(IOC), Dependency Injection(DI)  (0) 2015.07.13
Posted by Hoya0415
,


1. "웹 게시"대화 상자에서 "윈도우 Azure 웹 사이트"를 선택합니다.

2.  Microsoft 계정에 로그인하지 않은 경우,  로그인 그리고 기존 웹 사이트를 선택" 합니다.




3."기존 웹 사이트를 선택"대화 상자에서 클릭 New...


4. "윈도우 Azure에 사이트 만들기"대화 상자에서 고유 한 응용 프로그램 이름을 입력합니다. 

    지역 지역 드롭 ​​다운에서 당신에게 가장 가까운을 선택합니다. 클릭 만들기 

5 . "웹 게시"대화 상자에서 클릭 게시 .

6. 응용 프로그램이 게시를 완료하면, Azure app serivce 의 웹 애플리케이션 호스팅 SignalR 채팅 응용 프로그램은 브라우저에서 열립니다.


7. Azure app serivce 의 웹 애플리케이션에서 WebSocket을 활성화

WebSocket을 명시 적으로 SignalR 응용 프로그램에 사용되는 웹 응용 프로그램에서 활성화해야합니다. Azure에서는 Web Socket 옵션을 활성화해주면 됩니다. 그리고 구성 상단에  .NET 4.5 를 사용해주셔야 합니다.


해당 게시물의 모든 저작권은 Microsoft에 있습니다.

'.NET 개발 > SignalR' 카테고리의 다른 글

연결이 끊겼을 경우의 상황을 다 알아보기.  (0) 2015.10.21
2015-10-14 이슈 현황  (0) 2015.10.14
라이센스 이슈 해결 리스트  (0) 2015.10.08
Posted by Hoya0415
,

장점은 프로그래밍 적으로 연결 문자열을 만들기 때문에 개발이 더 동적이다.

필요한 라이브러리 : EntityFramework

클래스 : SqlConnectionStringBuilder,EntityConnectionStringBuilder

필요한 문자열 값

ProviderName : System.Data.SqlClient

ServerName : 서버 이름 

DatabaseName : 사용할 데이터 베이스 이름

Metadata = 예) "res://*/LocalModel.csdl|res://*/LocalModel.ssdl|res://*/LocalModel.msl";

이렇게 준비 하면 이제 동적으로 소스 상에서 연결 문자열을 만들 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 class Program
    {
        static void Main(string[] args)
        {
 
            // Specify the provider name, server and database.
            string providerName = "System.Data.SqlClient";
            string serverName = @".\SQLEXPRESS";
            string databaseName = "eLearning";
 
            // Initialize the connection string builder for the
            // underlying provider.
            SqlConnectionStringBuilder sqlBuilder =
                new SqlConnectionStringBuilder();
 
            // Set the properties for the data source.
            sqlBuilder.DataSource = serverName;
            sqlBuilder.InitialCatalog = databaseName;
            sqlBuilder.IntegratedSecurity = true;
 
            // Build the SqlConnection connection string.
            string providerString = sqlBuilder.ToString();
 
            // Initialize the EntityConnectionStringBuilder.
            EntityConnectionStringBuilder entityBuilder =
                new EntityConnectionStringBuilder();
 
            //Set the provider name.
            entityBuilder.Provider = providerName;
 
            // Set the provider-specific connection string.
            entityBuilder.ProviderConnectionString = providerString;
 
            // Set the Metadata location.
            entityBuilder.Metadata = @"res://*/LocalModel.csdl|res://*/LocalModel.ssdl|res://*/LocalModel.msl";
 
            Console.WriteLine(entityBuilder.ToString());
 
            using (EntityConnection conn =
                new EntityConnection(entityBuilder.ToString()))
            {
                conn.Open();
                Console.WriteLine("Just testing the connection.");
                conn.Close();
            }
 
        }
    }
cs


여기서 만든 EntityConnectionStringBuilder 객체를 EntityConnection 으로 인자값을 넘겨주면 된다.

1
2
3
4
using (SampleEntities _entity = new SampleEntities(EntityConnectionStringBuilder 인자값))
{
}
 
cs


Entity 객체를 사용할 때 데이터베이스 서버가 바뀔 수 있다. 하지만 여기서 중요한건 Schema는 바뀌면 안된다는 것이다.

Schema를 바꾼 데이터베이스를 연결했을 경우 분명 에러가 나타날 것이다.


Sample.

ConnectionStringSample.zip


Posted by Hoya0415
,

안녕하세요 . 오늘 포스팅은 Visual Studio 2010에서 지구 아이콘 혹은 메뉴에 Project에 Asp.net configuration Tool을 이용하였던 것인데 Visual Studio 2013 에서는 위에 말씀드린 것들이 없어 졌습니다. 그래서 IIS Express를 이용하여 해당 프로젝트가 있는 WEB 프로젝트의 절대 경로 를 설정해주어야 접속이 가능합니다.

1. 우선 명령 프롬프트를 실행합니다.

2. IIS Express가 있는 폴더 지정 위치로 이동합니다.

C:\Program Files (x86)\IIS Express

3. 명령 프롬프트에 IIS Express를 실행하면서 Port 설정을 하는데 이 {PORT}는 여러분이 안쓰시는 (Free) 한 Port를 써주시면 됩니다.

iisexpress.exe /path:C:\Windows\Microsoft.NET\Framework\v4.0.30319\ASP.NETWebAdminFiles /vpath:"/ASP.NETWebAdminFiles" /port:{PORT} /clr:4.0 /ntlm /trace:error


4. 위에서 지정한 포트로 IIS Express가 실행되면서 호스팅 되는 것을 볼 수 있습니다. 그리고 나서 아래의 주소를 쳐주면 됩니다.

 http://localhost:{PORT}/asp.netwebadminfiles/default.aspx?applicationPhysicalPath={Absolutely Route}&applicationUrl=/


{PORT}는 위에서 지정한 포트로 IIS Express가 실행

{Absolutely Route} 절대 경로는 예를 들어 해당 프로젝트의 웹쪽 경로를 주면 됩니다. 특정 파일이 아닌 경로입니다.

"C:\Users\HP\Source\Company\Sample\Sample.Web"


5. 아래와 같은 Asp.net configuration Tool가 나타날 것이다.


6.이제 WebConfig 파일에 연결한 DB가 정상적으로 연결되었는지 확인을 해주면 된다.

여기까지!^^

'.NET 개발 > ASP.NET Web API' 카테고리의 다른 글

@ViewBag is Not Working  (0) 2015.12.07
ASP.NET API 부수적으로 알아야할 기능들.  (0) 2015.12.06
aspnetdb 생성  (0) 2015.07.14
IPrincipal 와 Identity  (0) 2015.07.14
인증 및 권한 부여  (0) 2015.07.14
Posted by Hoya0415
,