Even if you use a timer, if it's fired every 30ms and you have UI code in the handler, then your UI will still be mostly unresponsive. You need to look at doing this in a different way, perhaps via a background thread.
[Update]
~~~~~~~~~
Actually you could use a worker thread and Sleep. Something like this will do what you want. You will see a smooth scrolling, and your UI should remain responsive:
private void ScrollButton_Click(object sender, EventArgs e)
{
var worker = new BackgroundWorker();
worker.DoWork += ScrollWorker_DoWork;
worker.RunWorkerAsync();
}
void ScrollWorker_DoWork(object sender, DoWorkEventArgs e)
{
for (int value = 0; value < someValue; value++)
{
scroll(value);
Thread.Sleep(30);
}
}