The problem is that you are enabling your timer on the second thread and this thread does not have a message pump.
The Windows forms timer is based on SetTimer. When the timer is enabled it creates a hidden window and sends the handle to that window to the SetTimer API, The system, in turn, sends the window a WM_TIMER message every time the interval for the timer has elapsed. The hidden window then processes that message and raises the Tick event.
In your situation the timer is created on the second thread but it does not have a message pump so the WM_TIMER message never reaches your window. What you want to do is enable your timer on your UI thread so that when the WM_TIMER message is sent it is processed in the UI thread which has a message pump. Assuming your procedure is inside your form class you can use the this reference to your form to marshal the call to enable the timer (if it isn't inside the form class you'll need a reference to the form) like so:
public byte[] ReadAllBytesFromStream(Stream input)
{
if(this.InvokeRequired)
{
this.Invoke(new MethodInvoker(clock.Start));
}
else
{
clock.Start();
}
using (...)
{
while (some conditions) //here we read all bytes from a stream (FTP)
{
...
(int-->) ByteCount = aValue;
...
}
return .... ;
}
}
private void clock_Tick(object sender, EventArgs e)
{
this.label6.Text = ByteCount.ToString() + " B/s"; //show how many bytes we have read in each second
}