2014-07-22 3 views
2

C#의 멀티 스레딩과 관련하여 두 가지 질문이 있습니다.다중 스레드 개체 액세스

내 프로그램에는 스크립트가 있고, 나는 그들을로드하고 실행하기 위해 LuaInterface 프로젝트를 사용하고있다. 다른 스레드에서 스크립트를 실행하려고하므로 다음을 수행했습니다.

new Thread(() => 
{ 
    using (Lua lua = new Lua()) 
    { 
     Script script = new Script(character, this.ID); 

     lua.RegisterFunction("sendMessage", script, typeof(NpcScript) 
      .GetMethod("SendMessage")); 

     lua.LoadFile(@"Scripts\" + this.Script + ".lua").Call(); 
    } 
}).Start(); 

이렇게하면 다른 스레드에서 스크립트를 실행해야합니다. Script 객체는 문자 객체에도 할당됩니다.

public Script Script { get; set; } 

스크립트의 클래스 strucutre 너무입니다 :

public class Script 
{ 
    public Character Character { get; private set; } 
    public int ID { get; private set; } 
} 

방법 sendMessage 첨부 부울 유형 값을 반환하는으로 ManualResetEvent를 사용하는 문자 클래스는 다음이있다. 주 프로그램 스레드가 값을 설정 한 다음 sendMessage가이를 반환합니다 (주 스레드가 응답을 설정할 때까지 sendMessage가 현재 스레드를 차단 함).

그러나 저는 두 가지 딜레마에 직면하고 있습니다.

1. 주 스레드가 Script 개체의 응답을 설정하면 (주 스레드에서 액세스하는 것처럼) 예외가 발생하지 않습니까?

2. 스크립트 스레드가 할당 된 문자 개체에 액세스하고 주 스레드도 액세스하면 어떻게됩니까? 충돌하지 않을까요?

감사합니다.

+2

1. 예외는 컨트롤의 핸들을 "소유"하지 않은 스레드에서 컨트롤에 액세스하려고 할 때만 발생합니다. 여기서 Windows 컨트롤을 사용하지 않으므로 걱정할 필요가 없습니다. 2. 어쩌면. 스크립트/문자 유형의 특성에 대한 명확한 설명 없이는 말하기 어렵습니다. –

+0

@ByteBlast 알아 두어야 할 사항은 무엇입니까? – user3865229

+0

그냥 주석 : 스크립트의 이름을 "CharacterScript"로 지정해야합니다. 현재 캐릭터 컨텍스트가 숨겨져 있고 사람들이 Carscript 또는 무엇이든 – Dbl

답변

0

@ByteBlast가 말한 것처럼 UI (양식, 컨트롤 등)로 작업하지 않으므로 예외가 발생할 위험이 없습니다. 그러나 @sasha_gud는 동일한 객체에 액세스하는 두 개의 스레드가 있기 때문에 문제를 피하기 위해 동기화를 구현해야한다고 말했을 때 맞습니다. 가장 간단한 방법은 Lock을 사용하는 것입니다.

관련 문제