.NET 4.0에는 비동기 프로그래밍 모델을 캡슐화하는 멋진 Task 클래스가 포함 된 TPL이 있습니다. .NET 2.0이어야하는 응용 프로그램에서 작업하고 있지만 Task를 다시 작성하지 않으려합니다. 어떤 제안?.NET 2.0에서 <T> 작업을 사용하려면 어떻게해야합니까?
답변
2.
죄송합니다 .NET 용 난 당신이 작업을 다시 할 해달라고 말했다 알고 있지만, 실제로는 Task 객체와 같이 동작하는 클로저를 사용하여 매우 간단하게 무언가를 만들 수 있습니다. .
public delegate R AsyncTask<R>();
public static AsyncTask<R> BeginTask<R>(AsyncTask<R> function)
{
R retv = default(R);
bool completed = false;
object sync = new object();
IAsyncResult asyncResult = function.BeginInvoke(
iAsyncResult =>
{
lock (sync)
{
completed = true;
retv = function.EndInvoke(iAsyncResult);
Monitor.Pulse(sync);
}
}, null);
return delegate
{
lock (sync)
{
if (!completed)
{
Monitor.Wait(sync);
}
return retv;
}
};
}
그것의 당신이 통과 대리인에 BeginInvoke()를 호출하고 블록을 불러 전달 된 함수의 결과를 대기하는 함수를 반환하는 함수 당신은 좋겠 : 이것은 내가 무엇을 사용 물론 다른 메소드 시그니처에 대해이 함수의 오버로드를 작성해야합니다.
한 가지 방법은 필요에 맞게 조정할 수 있으며 Continuations 등과 같은 다른 동작을 추가하는 것입니다. 핵심은 클로저와 익명의 대리자를 사용하는 것입니다. .NET 2.0에서 작동해야합니다.
편집 - 여기 당신이 그것을 사용하는 것이 방법입니다
public static string HelloWorld()
{
return "Hello World!";
}
static void Main(string[] args)
{
var task = BeginTask(HelloWorld); // non-blocking call
string result = task(); // block and wait
}
System.Threading.Thread
클래스를 사용해야합니다
, 당신은 .NET 3.5의 Task
클래스를 얻을 수 있지만
내가 작업 클래스 I 3.5에서 사용할 수있는 방법 .NET 4와 함께 제공 인상을했다? –
[Rx] (http://go.microsoft.com/fwlink/?LinkID=179929) 팀은 .NET 3.5 SP1로 'Task'및 기타 낮은 수준의 추상화 (전체 TPL 제외)를 백 포트했습니다. –
@Christial Schwarz, Stephen이 말했듯이, 그것은 백 포트되었습니다. – Jethro
- 1. .NET 2.0에서 .NET 4.0으로 마이그레이션
- 2. VBA에서 .NET 클래스를 사용하려면 어떻게해야합니까? 구문 도움말!
- 3. .NET 2.0에서 암호 해시?
- 4. 비표준 포트에서 .NET 웹 서비스를 사용하려면 어떻게해야합니까?
- 5. (SetupDiGetClassImageList의) HIMAGELIST를 .NET ImageList로 사용하려면 어떻게해야합니까?
- 6. .net 프로젝트에서 JavaScript InfoVis Toolkit을 사용하려면 어떻게해야합니까?
- 7. .NET 클래스에서이 원시 배열을 사용하려면 어떻게해야합니까?
- 8. ASP.NET 2.0에서 HttpResponse를 읽으려면 어떻게해야합니까?
- 9. C# List <T> .NET 2.0에서 .ConvertAll
- 10. WebClient에서 쿠키를 사용하려면 어떻게해야합니까?
- 11. .NET 2.0에서 리플렉션을 통해 .NET 3.5 어셈블리로드
- 12. .NET 2.0에서 .NET 3.5 기능을 사용하여 .... 작동합니까?
- 13. .NET 2.0에서 .NET 3.5 클래스 사용
- 14. .NET 2.0에서 XML로 문자열 읽기
- 15. 패턴과 관행을 효율적으로 사용하려면 어떻게해야합니까?
- 16. <ui:style>을 FlexTable과 함께 사용하려면 어떻게해야합니까?
- 17. Nant와 함께 컴파일러를 사용하려면 어떻게해야합니까?
- 18. MSBuild를 SVN과 함께 사용하려면 어떻게해야합니까?
- 19. .NET 2.0에서 대리자에게 대리자를 할당하는 방법
- 20. SDl_Threads를 올바르게 사용하려면 어떻게해야합니까?
- 21. Firefox를 사용하려면 어떻게해야합니까?
- 22. ChildWindow에서 VisualStates를 사용하려면 어떻게해야합니까?
- 23. Spring에서 https를 사용하려면 어떻게해야합니까?
- 24. 보기에서 'unless'키워드를 사용하려면 어떻게해야합니까?
- 25. 'htonl'을 사용하려면 어떻게해야합니까?
- 26. 해시에 변수를 사용하려면 어떻게해야합니까?
- 27. avalon 마법사를 사용하려면 어떻게해야합니까?
- 28. webapp2에서 ACL을 사용하려면 어떻게해야합니까?
- 29. Java : TreeBidiMap을 사용하려면 어떻게해야합니까?
- 30. 큰 wxCursor를 사용하려면 어떻게해야합니까?
감사합니다. 이것은 좋은 출발점입니다. –
코드를 살펴볼 때 BeginInvoke는 위에서 사용 된 HelloWorld를 [관리되는 스레드 풀의 새 스레드]에서 시작합니다 (http://stackoverflow.com/questions/3556634/does-funct-begininvoke-use-the-threadpool).). – rkagerer