1. Сначала убедись, что для твоей задачи действительно нужен именно поток, а не какая-то более высокоуровневая абстракция, например Task
2. Если всё-таки поток, то есть два варианта:
1. Через обратный вызов. В конце своей работы, в потоке нужно вызвать какой-то метод, который будет обрабатывать результат.
using System.Threading;
var data = new int[1]; // Какие-то данные
var thread = new Thread(() => {
var result = data.Length; // Какие-то ужасно сложные вычисления
HandleResult(result); // Это можно передать как параметр-делегат, но тут мы будем конкретный метод использовать
});
thread.Start(); // Стартуем
// Какие-то дела
thread.Join(); // Всё равно надо по-хорошему дождаться окончания работы потока
void HandleResult(int value) {
Console.WriteLine(value);
}
2. Через Join и какую-то общую переменную или поле.
using System.Threading;
var data = new int[1]; // Какие-то данные
var result = 0; // Какой-то результат (инициализируем значением по-умолчанию)
var thread = new Thread(() => {
result = data.Length; // Какие-то ужасно сложные вычисления
});
thread.Start(); // Стартуем
// Какая-то работа
thread.Join(); // Дожидаемся окончания работы потока
Console.WriteLine(result); // Используем результат работы