ListView에 크로스 스레드 로그를 만들려고합니다.
private enum LogType {Info, Error, Warning};
private delegate void AddItemCallback(string line, LogType lt);
private void LogAddInfo(string line, LogType lt)
{
if (lvLog.InvokeRequired)
{
AddItemCallback d = new AddItemCallback(LogAddInfo);
this.Invoke(d, new { line, lt }); // <-- here is the problem
}
else
{
// code that adds item to listView (in this case $o)
lvLog.Items.Add(new ListViewItem(DateTime.Now.ToString(" HH:mm:ss ") + line, (int)lt));
}
}
이렇게하면 매개 변수 수가 일치하지 않습니다. 새 개체를 올바르게 선언하는 방법은 무엇입니까? 미리 감사드립니다.
이 줄을 변경해야합니다.
this.Invoke(d, new { line, lt }); // <-- here is the problem
에:
this.Invoke(d, new object[] { line, lt });
// or
this.Invoke(d, line, lt);
버전은 2 개의 속성이있는 익명 클래스를 만들고 하나의 매개 변수로 전달됩니다. 이것이 매개 변수가 일치하지 않는 이유입니다.
객체의 배열 또는 두 개의 분리 된 매개 변수로 전달해야합니다.
유용한 팁. 크로스 스레딩 수정 컨트롤 (호출 포함)은 스레드 코드를 느슨하게 만들 수 있습니다. 문제는 foreach 콜백이 호출된다는 것입니다. 더 좋은 방법은 정보를 대기열에 저장하고 타이머를 사용하여 대기열을 처리하는 것입니다.
예를 들면 :
private class LogMessage
{
public DateTime CreatedOn {get;} = DateTime.Now;
public string Line {get;set;}
public LogType LogType {get; set;}
}
private List<LogMessage> _logQueue = new List<LogMessage>();
private void LogAddInfo(string line, LogType lt)
{
lock(_logQueue)
_logQueue.Add(new LogMessage { Line = line, LogType = lt });
}
private void Timer1_tick(object sender, EventArgs e)
{
LogMessage[] messages;
lock(_logQueue)
{
messages = _logQueue.ToArray();
_logQueue.Clear();
}
foreach(var msg in messages)
{
// add to listview
}
}
hui 업데이트가 적기 때문에 훨씬 더 잘 실행됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다