내 질문은 이러한 질문에 조금 비슷합니다 대의원을 사용하여 호출지연 방법은
replay a list of functions and parameters
C# delegate for two methods with different parameters
내 목표는 그들을 호출, 함수는 목록에서 해당 매개 변수 통화를 저장하는 것입니다 내 매니저 클래스에 의해 스케쥴 된 다른 스레드.
함수가 호출- , 매개 변수를 기억 함수 목록에 자신을 추가하고 함수가 종료되면
- , 나는
- 허용 (어떤이있는 경우) 반환 객체를 다시 얻으려면 값 나중에 호출 할 함수 목록
- 완전히 다른 서명이있는 (그 중 일부는 반환 값 (bool, int, object ..)을 가지고 있고 일부는 반환하지 않았으며 메소드 파라미터의 수는 고정되어 있지 않다)
예컨대 I 그런 funstions 호출 할 :
ServerManager.addDoSomething(ServerManager.SERVICES.Login, serverURL, userName, password); // Login() with bool return type and 3 string parameters
ServerManager.addDoSomething(ServerManager.SERVICES.Query, searchExpr); // Query() with MyData return type and 1 string parameters
ServerManager.addDoSomething(ServerManager.SERVICES.Modify, searchExpr, newVal); // Modify() with int return type and 2 string parameters
ServerManager.addDoSomething(ServerManager.SERVICES.Logout); // Logout() with void return type and 0 parameters
또는 그런
:ServerManager.addDoSomething (() => ServerManager.SERVICES.Query (searchExpr));
ServerManager.addDoSomething (() => ServerManager.SERVICES.Modify (searchExpr, newVal)); ServerManager.addDoSomething (() => ServerManager.SERVICES.Logout()); ServerManager.addDoSomething (() => ServerManager.SERVICES.Login (serverURL, userName, password));
또는 인터페이스를 지원하는 다른 방법
.. 어떻게해야 내 ServerManager.addDoSomething 방법 (또는 방법 다른 서명 경우)처럼, 어떤 데이터 구조를 사용해야합니까 (WHAT_SHOULD_I_STORE), I 경우 지연된 함수 호출을 지원하고 싶습니다. 반환 값은 어떻게 되 찾을 수 있습니까?public class ServerManager
{
static List<WHAT_SHOULD_I_STORE> requestFIFO = new List<WHAT_SHOULD_I_STORE>();
public static IServerConnection SERVICES ;
static BackgroundWorker worker = new BackgroundWorker();
public ServerManager()
{
SERVICES = new ServerConnection();
worker.DoWork += (o, ea) =>
{
try
{
WHAT_SHOULD_I_STORE mr = null;
Application.Current.Dispatcher.Invoke(new Action(() => mr = popQueueElement()));
if (mr != null)
processRequestFromQueue(mr);
}
catch (Exception)
{
}
};
worker.RunWorkerCompleted += (o, ea) =>
{
worker.RunWorkerAsync();
};
if (! worker.IsBusy) worker.RunWorkerAsync();
}
private WHAT_SHOULD_I_STORE popQueueElement()
{
if (requestFIFO != null && requestFIFO.Count > 0)
{
WHAT_SHOULD_I_STORE result = requestFIFO.ElementAt(0);
requestFIFO.Remove(result);
return result;
}
else
return null;
}
private addDoSomething(...)
{
//....
}
}
public class ServerConnection : IServerConnection
{
// Concrete implementations of the IServerManager interface
}
public interface IServerConnection
{
bool Login (string serverURL, string userName, string password);
MyData Query (string serverURL, searchExpr);
int Modify (string searchExpr, string newVal);
void Logout ();
// ...
}
업데이트 : 죄송 합니다만 "worker"라는 변수가 BackgroundWorker 클래스의 인스턴스라는 것을 놓쳤습니다. – user1802693