The problem of the Bruce answer is that if the workflow is already started if throws an exption..
To fix this I modified his code, checking and removing the Workflow if there is!
private static void RestartWorkflow(SPListItem listItem, string workflowName)
{
SPWorkflowAssociation wfAssoc = listItem.ParentList.WorkflowAssociations.GetAssociationByName(workflowName, System.Globalization.CultureInfo.CurrentCulture);
var WF = listItem.Workflows.Cast<SPWorkflow>().Where(X => X.ParentAssociation.Name == "Flusso di gestione delle informazioni"); //My wf name
if (WF.Any()) //if there is remove
{
listItem.Web.Site.WorkflowManager.RemoveWorkflowFromListItem(WF.First());
} //start
listItem.Web.Site.WorkflowManager.StartWorkflow(listItem, wfAssoc, wfAssoc.AssociationData, true);
}