Доступ к общему StringCollections
От: bonbow  
Дата: 21.04.10 09:32
Оценка:
Вот такая проблема:

Есть класс myconst;
class myconst
{
       public StringCollection sc_log = new StringCollection() 
}


Есть MainForm которая с помощью BackGroundWorker что то делает и результат пишет в sc_log.
public partial class MainForm : Form
    {
      public myconst cc = new myconst();
       WorkForm wf = new WorkForm();

....
private void button1_Click(object sender, EventArgs e)
        {
            wf.progressBar1.Value = 0;
            wf.progressBar1.Maximum = trackBar1.Value;
            backgroundWorker1.RunWorkerAsync(trackBar1.Value);
            wf.CButton.Text = "Cancel";
            wf.MyParentForm = this;
            wf.StartPosition = FormStartPosition.CenterParent;
            wf.Enabled = true;
            wf.ShowDialog();
            
        }
....
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {

            int i = 0;
            int max = (int)e.Argument;
            
            for (i = 0; i < max; i++)
            {
            if (backgroundWorker1.CancellationPending)
                    {
                        e.Cancel = true;
                    }
                    else
                    {
                        this.InvokeIfNeeded(
                        () => cc.sc_log.Add(string.Format("Working ...{0}",i+1))

                            );
                        Thread.Sleep(1000);
                        backgroundWorker1.ReportProgress(i+1);
                    }
            }
        
        
        }
...


В тоже время я хочу посмотреть из другой формы в реал тайм что же пишется в sc_log:
public partial class LogForm : Form
    {
        public MainForm MyParentForm;
        public LogForm()
        {
            InitializeComponent();
        }

        private void LogForm_Shown(object sender, EventArgs e)
        {
            LogBox.Items.Clear();

            LogBox.Items.Add(MyParentForm.cc.sc_log[0]);
        }
    }

Но получаю вот такую ошибку:
Error    1    Inconsistent accessibility: field type 'ThreadPoolInvoked.myconst' is less accessible than field 'ThreadPoolInvoked.MainForm.cc'    d:\мои документы\visual studio 2010\Projects\ThreadPoolInvoked\ThreadPoolInvoked\MainForm.cs    17    16    ThreadPoolInvoked


Прошу помощи в разборе ошибки.
Может быть подскажете более элегантное решение ? (в файл писать лог пока что не хочу)


Исправил класс myconst на public
public class myconst 
{ 
       public StringCollection sc_log = new StringCollection()  
}


Ошибка исчезла, однако при попытке посмотреть лог sc_log не доступен из LogForm.

Небольшое уточнение:

LogForm вызывается по клику на Label1с WorkForm , которая вызывается по клику на кнопку "Start" из MainForm.
c#
Re: Доступ к общему StringCollections
От: Gremlin2 http://www.fb2library.net/
Дата: 21.04.10 18:43
Оценка:
Здравствуйте, bonbow, Вы писали:

B>Вот такая проблема:


B>Есть класс myconst;

B>
B>class myconst
B>{
B>       public StringCollection sc_log = new StringCollection() 
B>}
B>


...

У как у вас всё запущенно то

1. Сделать поле sc_log статическим, и обращаться к нему как myconst.sc_log без создания экземпляра класса myconst
2. Прочитать про Naming Conventions принятых в .NET
3. Подумать о том, что доступ к sc_log из разных потоков без синхронизации это плохо

B>Ошибка исчезла, однако при попытке посмотреть лог sc_log не доступен из LogForm.


А тут я вообще ни чего не понял

B>Небольшое уточнение:


B>LogForm вызывается по клику на Label1с WorkForm , которая вызывается по клику на кнопку "Start" из MainForm.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.