Program Language

728x90
반응형

 

HttpWebRequest 객체의 BeginGetResponse 메소드를 이용해서 비동기 프로세스를 구축 할 수 있습니다.

하지만 이와 같은 시스템 구축시, 서버당 2개의 TCP 연결 제한이 걸리게 되는 현상이 발생합니다.

사내에서 부하테스를 하는 과정에서 해당 구문을 사용했을 때, 2개의 커넥션만 발생하는 문제가 발생되어

이를 해결하기 위한 방법을 정리하였습니다.

 

 

app.config 설정 추가

<configuration>
  <system.net>
    <connectionManagement>
      <add address="*" maxconnection="100" />
    </connectionManagement>
  </system.net>
</configuration>

connectionManagement의 maxconnection 값의 수치를 변경합니다.

DefaultConnectionLimit 의 기본값은 2로 설정이 되어 있으며, 위 처럼 app.config에 설정을 추가함으로서 커넥션의 수치를 변경할 수 있습니다.

 

하지만, DefaultConnectionLimit 등록 정보를 변경해도 기존 ServicePoint 객체에는 영향을주지 않습니다.

 

 

ServicePoint 값 변경

request.ServicePoint.ConnectionLimit = 1000;

request.BeginGetResponse(
    GetResponseCallback,
    new RequestState
    {
        Request = request,
        PostData = new byte[] { },
        Response = signal
    });

아쉽게도 설정파일로 설정이 적용되지 않는 경우 기본값은 DefaultPersistentConnectionLimit 상수로 설정됩니다.

이럴경우에는 직접 ServicePoint의 ConnectionLimit 값을 변경해서 사용해줘야 합니다.

위 처럼

request.ServicePoint.ConnectionLimit = 1000;

 

ServicePoint 의 ConnectionLimit 값을 변경해주면, 2개 이상의 TCP 커넥션을 사용 하 실 수 있습니다.

 

 

 

 

 

 

 

 

[출처]

http://daplus.net/net-webclient%EC%97%90%EC%84%9C-2-%EA%B0%9C%EC%9D%98-%EC%97%B0%EA%B2%B0-%EC%A0%9C%ED%95%9C%EC%9D%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EB%B0%A9%EC%8B%9D%EC%9C%BC%EB%A1%9C-%EC%A0%9C/

 

https://social.msdn.microsoft.com/Forums/en-US/1f863f20-09f9-49a5-8eee-17a89b591007/asynchronous-httpwebrequest-maximum-connections-best-approach-threads-or-delegates?forum=netfxnetcom

 

 

 

728x90
728x90
반응형

필요한 시점에 항상 찾게되는 .NET Framework 다운로드 링크!! 간혹 서버 셋팅시에 닷넷 프레임워크를 수동으로 다운 받아야 하는 경우가 있는데요. 

그때! 빠르게나마 찾기 위해서 다운로드 링크를 필요에 의해서 글을 남겨놉니다. 

 

 

https://dotnet.microsoft.com/download/dotnet-framework

 

Download .NET Framework | Free official downloads

Downloads for building and running applications with .NET Framework. Get web installer, offline installer, and language pack downloads for .NET Framework.

dotnet.microsoft.com

 

 

지원하는 버전과, 그 외 버전이 잘 구분되어 있어서 편하게 다운 받을 수 있습니다.

 

 

 

 

 

 

728x90
728x90
반응형

Winform을 이용해서 프로젝트를 많이 수행하는 편은 아니다보니, 그때 그때 필요한 사항을 찾아서 개발하곤 합니다. 

가급적 테스트 툴을 개발하는 목적으로 많이 사용하다보니, 사용성은 적은데요.

그러다 보면, 가끔 List View를 이용해서 Log 를 보여줄때 thread 에 영향을 받게 되는 경우가 발생합니다.


msdn 에 검색해 보니, 아래 링크 검색이 되서 공유합니다. 

 


 

 

docs.microsoft.com/ko-kr/dotnet/desktop/winforms/controls/how-to-make-thread-safe-calls-to-windows-forms-controls?view=netframeworkdesktop-4.8

 

스레드로부터 안전한 컨트롤 호출 - Windows Forms .NET Framework

스레드로부터 안전한 방식으로 크로스 스레드 컨트롤을 호출 하 여 앱에서 다중 스레딩을 구현 하는 방법에 대해 알아봅니다.

docs.microsoft.com

 

사용방법

저는 주로 delegate를 이용해서 Log를 찍는 방법을 선호합니다. 

public partial class MainForm : Form
{
    private delegate void SafeUpdateText(string text);
    public MainForm()
    {
        InitializeComponent();
    }
       
}

MainForm Class 에 SafeUpdateText delegate 선언해 줍니다. 

 

 

 

public void UpdateMessage(string msg)
{
    if (RichTxt_ReceiveMsg.InvokeRequired)
    {
        var d = new SafeUpdateText(UpdateMessage);
        RichTxt_ReceiveMsg.Invoke(d, new object[] { msg });
    }
    else
    {
        RichTxt_ReceiveMsg.AppendText(msg + "\r\n");
    }
}

실질적으로 작업을 수행하는 UpdateMessage 메소드에서, 

InvokeRequired 메소드는, 컨트롤의 스레드 ID와 호출하는 스레드 ID를 비교하는 속성을 쿼리하는 메소입니다. 

이를 이용해서 ID가 다를 경우, 기본스레드에서 대리자를 사용해 메서드를 호출하는 방식입니다. 

 

 

 

 

WinForm 의 경우 UI thread를 사용하고 있으니, 

위 방법을 이용하면 좋을 듯 합니다. 

728x90
728x90
반응형

요즘 동기와 비동기가 혼재되어 사용중인 프로젝트를 진행하고 있습니다. 

최초 설계시부터 작업방식을 정해놓고 진행해야 하는데, 이 프로젝트는 그러지 못했나 봅니다.

 

설계과정에서부터 비동기 async / await 모델로 설계된 프로젝트가 아니라면,

중간에 적용하기에 애매한 상황이 발생합니다.

프로젝트를 다시 설계할 수 있는 상황이 아니라면, Task.Run() 메소드를 이용해서 비동기 호출을 이용 할 수 있습니다. 

 


호출 방법

public bool Test()
{
	var result = Task.Run(async () => await Update()).Result;
	return result;
}

 

public async Task<bool> Update()
{
	...
}

 

위와 같이 람다식을 이용해서, 비동기로 짜여진 Update() 메소드를 호출 할 수 있습니다. 

 

 

 

728x90

[C#] MessagePack 사용 방법

2020. 7. 13. 22:49
728x90
반응형

 

 

 

 

MessagePack 이란?

MessagePack은 C#용 시리얼 라이저의 일종입니다. MsgPack-Cli 보다 10배 빠르다고 공식 GitHub에 명시되어 있으며, 다른 C# 직렬 변환기보다 성능이 뛰어납니다. 

MessagePack for C#은 또한 매우 빠른 압축 알고리즘 인 LZ4 압축을 기본적으로 지원합니다. 

특히 게임, 분산 컴퓨팅, 마이크로 서비스 또는 데이터 캐시와 같은 응용 프로그램에서 성능이 중요합니다.

 

 


공식 GitHub

https://github.com/neuecc/MessagePack-CSharp

 

neuecc/MessagePack-CSharp

Extremely Fast MessagePack Serializer for C#(.NET, .NET Core, Unity, Xamarin). / msgpack.org[C#] - neuecc/MessagePack-CSharp

github.com

 


Nuget Package를 이용한 MessagePack 설치

Nuget 패키지를 이용해서 설치를 합니다. MessagePack을 검색하여 나오는 상단의 패키지를 설치 합니다.

해당 패키지의 경우 ZeroFormatter에 비해 많은 종속성이 걸려 있습니다. 

 

MessagePack 하나만 설치 했는데도, 아래와 같이 다양한 종속성을 가지고 있네요.

만약, 다른 패키지와 혼용해서 사용하신다면, 아래의 종속성 때문에 오류를 발생하는 경우도 한번 겪었습니다. 

 


 

 

 

 


Sample

전반적으로 ZeroFormatter 와 사용방법에는 큰 차이가 없습니다만, 

ZeroFormatter의 경우 Index Attribute를 이용했지만, MessagePack의 경우는 Key Attribute를 이용하는 차이가 있습니다.

using MessagePack;

namespace MPackTest.Models
{
    [MessagePackObject]
    public class GameEvent
    {
        [Key(0)]
        public virtual int Index { get; set; }
        [Key(1)]
        public virtual int Season { get; set; }
        [Key(2)]
        public virtual int Score { get; set; }
    }
}

 

using MessagePack;
using System;
using System.Collections.Generic;

namespace MPackTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var gameEvent = new List<Models.GameEvent>();
            for (int i = 0; i < 1000; i++)
            {
                gameEvent.Add(new Models.GameEvent { Index = i, Score = i, Season = i });
            }

            var serialize = MessagePackSerializer.Serialize<List<Models.GameEvent>>(gameEvent);
            Console.WriteLine($"Serialize 크기 : {serialize.Length}");


            var deserialize = MessagePackSerializer.Deserialize<List<Models.GameEvent>>(serialize);
            Console.WriteLine($"DeSerialize 50번 인덱스 : {deserialize[50].Index}");

            Console.ReadLine();
        }
    }
}

 

 

728x90
728x90
반응형

 

 

 

 

 

기존에 진행하던 프로젝트에서는 Newtonsoft Json을 이용해서 시리얼라이즈 해서 사용하였습니다.

하지만 새로 진행하는 프로젝트에서 시리얼라이즈 하는 데이터량이 상당이 많아지는 이슈가 발생하였습니다.

 

속도를 개선할 이슈가 발생해서, 기존에 다른 프로젝트에서 사용하였던 Zeroformatter를 다시 도입하였는데요.

이번기회에 다시 한번 정리해보려고 합니다.

 


Zeroformatter 란?

Zeroformatter는 C# 프로젝트에서 사용할 수 있는 직렬화 오픈소스 입니다. 

다양한 시리얼라이저의 사용법을 정리할 생각이지만, 

여러 시리얼라이저의 속도를 직접 비교해 보았을때, 가장 빠른 속도를 보여줬습니다. 

아래의 링크를 통해서 더 자세한 정보를 확인 하실 수 있습니다. 

 

 

https://github.com/neuecc/ZeroFormatter

 

neuecc/ZeroFormatter

Infinitely Fast Deserializer for .NET, .NET Core and Unity. - neuecc/ZeroFormatter

github.com

 


Nuget Package를 이용한 설치

Nuget Package 관리자를 이용해서 Zeroformatter를 검색합니다.

가장 상단에 있는 ZeroFormatter를 설치합니다.

 

 



Sample

먼저 시리얼라이즈 할 객체에 추가 작업을 진행해야 합니다.

아래의 기존 Class에 Zeroformatter를 사용하기 위해서는 virtual 키워드와 index 작업을 진행해줘야 합니다.

그리고 Zeroformatter의 사용을 위한 추가 attribute 도 기입해줘야 합니다.

index작업은 진행하지 않아도 되지만, 기입하는 것이 좀 더 속도가 나온다고 합니다.

using System;

namespace ZeroTest.Models
{
    public class GameEvent
    {
        public int Index { get; set; }
        public int Season { get; set; }
        public int Score { get; set; }
    }
}

 

using System;
using ZeroFormatter;

namespace ZeroTest.Models
{
    [ZeroFormattable]
    [Serializable]
    public class GameEvent
    {
        [Index(0)]
        public virtual int Index { get; set; }
        [Index(1)]
        public virtual int Season { get; set; }
        [Index(2)]
        public virtual int Score { get; set; }
    }
}

 

 

아래와 같이 Serialize 구문을 이용하면 됩니다. 

대략 사이즈와 DeSerialize 했을때 50번째 있는 Index 값을 찍어보았습니다. 

namespace ZeroTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var gameEvent = new List<Models.GameEvent>();
            for (int i = 0; i < 1000; i++)
            {
                gameEvent.Add(new Models.GameEvent { Index = i, Score = i, Season = i });
            }

            var serialize = ZeroFormatterSerializer.Serialize<List<Models.GameEvent>>(gameEvent);
            Console.WriteLine($"Serialize 크기 : {serialize.Length}");


            var deserialize = ZeroFormatterSerializer.Deserialize<List<Models.GameEvent>>(serialize);
            Console.WriteLine($"DeSerialize 50번 인덱스 : {deserialize[50].Index}");

            Console.ReadLine();
        }
    }
}

 

 


참고

퍼포먼스만 보더라도 ZeroFormatter 가 Serialize 부분에서는 가장 빠르다고 나오네요. 

실제 제가 테스트 해보았을 때 도 가장 빨랐던 기억이 있습니다.

다만, 단점 이라면, Index 와 virtual 키워드를 항상 달고 살아야 합니다. ^^

 

 

 

 

 

 

 

 

 

728x90

+ Recent posts