2015-08-01 2 views
0
static BackgroundWorker worker; 
    static void Main(string[] args) 
    { 
     worker = new BackgroundWorker(); 
     worker.DoWork += worker_DoWork; 
     worker.RunWorkerAsync(); 
     Console.ReadLine(); 
    } 
    static void worker_DoWork(object sender,DoWorkEventArgs e) 
    { 
     string strClientId = "2211"; Authenticate(ref strClientId); 
    } 
    static void Authenticate(ref string strClientId) 
    { 
     Timer timer = new Timer(500); 
     //Error in this line 
     //Cannot use ref or out parameter 'strClientId' inside an anonymous method,lambda expression or query expression 
     timer.Elapsed += (sender, e) => Authenticates_Timer(sender, e,ref strClientId); 
     //timer.Elapsed += Authenticates_Timer(); 
     timer.Start(); 
    } 
    static void Authenticates_Timer(object sender, ElapsedEventArgs e, ref string strClientId) 
    { 
     //want to use variable here 
     strClientId = ""; 
    } 

, если есть способ я могу использовать переменную реф при прохождении параметра в случае нельзя использовать реф или из параметра «strClientId» внутри анонимного метода, лямбда-выражения или запрос expression.I знает, что это повторяется вопрос, но я не смог понять, как решить эту проблему уже refered различных сообщений и разместил вопрос в CodeProject тоже, но никто не отвечают какой-либо помощи ценитсянельзя использовать использовать реф или из параметров для анонимных методов

+0

Вы всегда можете создать класс, который имеет поле для хранения идентификатора клиента. Затем передайте экземпляр класса. –

ответ

0

Я бы рекомендовал обмен strClientId как статический переменный le:

static BackgroundWorker worker; 
static string strClientId; 
static void Main(string[] args) 
{ 
    worker = new BackgroundWorker(); 
    worker.DoWork += worker_DoWork; 
    worker.RunWorkerAsync(); 
    Console.ReadLine(); 
} 
static void worker_DoWork(object sender,DoWorkEventArgs e) 
{ 
    strClientId = "2211"; 
    Authenticate(); 
} 
static void Authenticate() 
{ 
    Timer timer = new Timer(500); 
    timer.Elapsed += (sender, e) => Authenticates_Timer(sender, e); 
    timer.Start(); 
} 
static void Authenticates_Timer(object sender, ElapsedEventArgs e) 
{ 
    strClientId = ""; 
} 

Будет ли это работать на вас?

Обновление: Хорошо, давайте попробуем это одно:

static void worker_DoWork(object sender,DoWorkEventArgs e) 
{ 
    string strClientId = ""; 
    var setClientId = new Action<string>(v => { strClientId = v; }); 
    setClientId("2211"); 
    Authenticate(setClientId); 
} 

static void Authenticate(Action<string> setClientId) 
{ 
    Timer timer = new Timer(500); 
    timer.Elapsed += (sender, e) => Authenticates_Timer(sender, e, setClientId); 
    timer.Start();  
} 

static void Authenticates_Timer(object sender, ElapsedEventArgs e, Action<string> setClientId) 
{ 
    setClientId(""); 
} 
+0

Я знаю, что могу использовать статические, но моя команда привела не использовать статические. – Ramakrishna

+0

может измениться значение также отражается в событии dowork – Ramakrishna

+0

Я так думаю. Действие на самом деле является закрытием, поэтому вы можете передать ссылку на него почти в любом месте текущего AppDomain, и оно должно работать. –

Смежные вопросы