Для исходного файла при запуске асинхронного процесса вы можете указать объект токена пользователя и сослаться на него в объекте e.userstate. Это просто простой объект, поэтому вы можете поместить в него все, что захотите, чтобы отследить, что вышло. По крайней мере, это мое понимание, я никогда не использовал объект e.userstate.
Что касается ошибки или успеха, всякий раз, когда вы ссылаетесь на асинхронные завершенные события, вы всегда должны сначала проверять, является ли e.error ничем, прежде чем ссылаться на любые другие свойства e. Если e.error - это ничто, а e.cancelled - ничто, передача прошла успешно. Если e.error не является ничем, тогда выполните поиск e.error, чтобы найти ошибку. Не ссылайтесь на e.result, если e.error - это что-то, потому что это вызовет исключение.
Кроме того, объект-отправитель не ссылается на исходный объект, который вы использовали для отправки файла? Выполните преобразование Ctype, и вы сможете получить подробную информацию о том, что вы отправили.